From b6983e68666e6768ef24a0011c2a07f3352448c9 Mon Sep 17 00:00:00 2001 From: da <> Date: Mon, 15 Jan 2024 22:06:46 +0100 Subject: [PATCH 001/117] add ntfy-client.service as user service --- .goreleaser.yml | 3 +++ client/user/ntfy-client.service | 10 +++++++ docs/subscribe/cli.md | 47 +++++++++------------------------ scripts/postinst.sh | 11 +++++++- 4 files changed, 35 insertions(+), 36 deletions(-) create mode 100644 client/user/ntfy-client.service diff --git a/.goreleaser.yml b/.goreleaser.yml index 062cce1f..469b7ee6 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -90,6 +90,8 @@ nfpms: type: "config|noreplace" - src: client/ntfy-client.service dst: /lib/systemd/system/ntfy-client.service + - src: client/user/ntfy-client.service + dst: /lib/systemd/user/ntfy-client.service - dst: /var/cache/ntfy type: dir - dst: /var/cache/ntfy/attachments @@ -119,6 +121,7 @@ archives: - server/ntfy.service - client/client.yml - client/ntfy-client.service + - client/user/ntfy-client.service - id: ntfy_windows builds: diff --git a/client/user/ntfy-client.service b/client/user/ntfy-client.service new file mode 100644 index 00000000..0a9598ee --- /dev/null +++ b/client/user/ntfy-client.service @@ -0,0 +1,10 @@ +[Unit] +Description=ntfy client +After=network.target + +[Service] +ExecStart=/usr/bin/ntfy subscribe --config "%h/.config/ntfy/client.yml" --from-config +Restart=on-failure + +[Install] +WantedBy=default.target diff --git a/docs/subscribe/cli.md b/docs/subscribe/cli.md index 7f589d3c..ed8e2791 100644 --- a/docs/subscribe/cli.md +++ b/docs/subscribe/cli.md @@ -263,43 +263,20 @@ will be used, otherwise, the subscription settings will override the defaults. require authentication), be sure that the servers/topics you subscribe to use HTTPS to prevent leaking the username and password. ### Using the systemd service -You can use the `ntfy-client` systemd service (see [ntfy-client.service](https://github.com/binwiederhier/ntfy/blob/main/client/ntfy-client.service)) -to subscribe to multiple topics just like in the example above. The service is automatically installed (but not started) -if you install the deb/rpm package. To configure it, simply edit `/etc/ntfy/client.yml` and run `sudo systemctl restart ntfy-client`. +You can use the `ntfy-client` systemd services to subscribe to multiple topics just like in the example above. +You have the option of either enabling `ntfy-client` as a system service (see +[here](https://github.com/binwiederhier/ntfy/blob/main/client/ntfy-client.service)) +or user service (see [here](https://github.com/binwiederhier/ntfy/blob/main/client/user/ntfy-client.service)). +The services are automatically installed (but not started) if you install the deb/rpm/AUR package. +The system service ensures that ntfy is run at startup (useful for servers), +while the user service starts ntfy only after the user has logged in. The user service is recommended for personal machine use. + +To configure `ntfy-client` as a system service it, edit `/etc/ntfy/client.yml` and run `sudo systemctl restart ntfy-client`. + +To configure `ntfy-client` as a user service it, edit `~/.config/ntfy/client.yml` and run `systemctl --user restart ntfy-client` (without sudo). !!! info - The `ntfy-client.service` runs as user `ntfy`, meaning that typical Linux permission restrictions apply. See below - for how to fix this. - -If the service runs on your personal desktop machine, you may want to override the service user/group (`User=` and `Group=`), and -adjust the `DISPLAY` and `DBUS_SESSION_BUS_ADDRESS` environment variables. This will allow you to run commands in your X session -as the primary machine user. - -You can either manually override these systemd service entries with `sudo systemctl edit ntfy-client`, and add this -(assuming your user is `phil`). Don't forget to run `sudo systemctl daemon-reload` and `sudo systemctl restart ntfy-client` -after editing the service file: - -=== "/etc/systemd/system/ntfy-client.service.d/override.conf" - ``` - [Service] - User=phil - Group=phil - Environment="DISPLAY=:0" "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus" - ``` -Or you can run the following script that creates this override config for you: - -``` -sudo sh -c 'cat > /etc/systemd/system/ntfy-client.service.d/override.conf' </dev/null || true + systemctl --user daemon-reload >/dev/null || true if systemctl is-active -q ntfy.service; then echo "Restarting ntfy.service ..." if [ -x /usr/bin/deb-systemd-invoke ]; then @@ -33,12 +34,20 @@ if [ "$1" = "configure" ] || [ "$1" -ge 1 ]; then fi fi if systemctl is-active -q ntfy-client.service; then - echo "Restarting ntfy-client.service ..." + echo "Restarting ntfy-client.service (system) ..." if [ -x /usr/bin/deb-systemd-invoke ]; then deb-systemd-invoke try-restart ntfy-client.service >/dev/null || true else systemctl restart ntfy-client.service >/dev/null || true fi fi + if systemctl --user is-active -q ntfy-client.service; then + echo "Restarting ntfy-client.service (user)..." + if [ -x /usr/bin/deb-systemd-invoke ]; then + deb-systemd-invoke --user try-restart ntfy-client.service >/dev/null || true + else + systemctl --user restart ntfy-client.service >/dev/null || true + fi + fi fi fi From 5211d06f2cf6df049942edce655fed7fb9f94521 Mon Sep 17 00:00:00 2001 From: stendler Date: Wed, 29 May 2024 21:23:06 +0200 Subject: [PATCH 002/117] feat(server): add Cache and Firebase as keys to JSON publishing https://github.com/binwiederhier/ntfy/issues/1119 --- server/server.go | 6 ++++++ server/server_test.go | 45 +++++++++++++++++++++++++++++++++++++++++++ server/types.go | 2 ++ 3 files changed, 53 insertions(+) diff --git a/server/server.go b/server/server.go index eb0fd120..eb4e5504 100644 --- a/server/server.go +++ b/server/server.go @@ -1862,6 +1862,12 @@ func (s *Server) transformBodyJSON(next handleFunc) handleFunc { if m.Call != "" { r.Header.Set("X-Call", m.Call) } + if m.Cache != "" { + r.Header.Set("X-Cache", m.Cache) + } + if m.Firebase != "" { + r.Header.Set("X-Firebase", m.Firebase) + } return next(w, r, v) } } diff --git a/server/server_test.go b/server/server_test.go index ef9157cb..460b6deb 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -84,6 +84,22 @@ func TestServer_PublishWithFirebase(t *testing.T) { require.Equal(t, "my first message", sender.Messages()[0].APNS.Payload.CustomData["message"]) } +func TestServer_PublishWithoutFirebase(t *testing.T) { + sender := newTestFirebaseSender(10) + s := newTestServer(t, newTestConfig(t)) + s.firebaseClient = newFirebaseClient(sender, &testAuther{Allow: true}) + + response := request(t, s, "PUT", "/mytopic", "my first message", map[string]string{ + "firebase": "no", + }) + msg1 := toMessage(t, response.Body.String()) + require.NotEmpty(t, msg1.ID) + require.Equal(t, "my first message", msg1.Message) + + time.Sleep(100 * time.Millisecond) // Firebase publishing happens + require.Equal(t, 0, len(sender.Messages())) +} + func TestServer_PublishWithFirebase_WithoutUsers_AndWithoutPanic(t *testing.T) { // This tests issue #641, which used to panic before the fix @@ -1669,6 +1685,35 @@ func TestServer_PublishAsJSON_WithActions(t *testing.T) { require.Equal(t, "target_temp_f=65", m.Actions[1].Body) } +func TestServer_PublishAsJSON_NoCache(t *testing.T) { + s := newTestServer(t, newTestConfig(t)) + body := `{"topic":"mytopic","message": "this message is not cached","cache":"no"}` + response := request(t, s, "PUT", "/", body, nil) + msg := toMessage(t, response.Body.String()) + require.NotEmpty(t, msg.ID) + require.Equal(t, "this message is not cached", msg.Message) + require.Equal(t, int64(0), msg.Expires) + + response = request(t, s, "GET", "/mytopic/json?poll=1", "", nil) + messages := toMessages(t, response.Body.String()) + require.Empty(t, messages) +} + +func TestServer_PublishAsJSON_WithoutFirebase(t *testing.T) { + sender := newTestFirebaseSender(10) + s := newTestServer(t, newTestConfig(t)) + s.firebaseClient = newFirebaseClient(sender, &testAuther{Allow: true}) + + body := `{"topic":"mytopic","message": "my first message","firebase":"no"}` + response := request(t, s, "PUT", "/", body, nil) + msg1 := toMessage(t, response.Body.String()) + require.NotEmpty(t, msg1.ID) + require.Equal(t, "my first message", msg1.Message) + + time.Sleep(100 * time.Millisecond) // Firebase publishing happens + require.Equal(t, 0, len(sender.Messages())) +} + func TestServer_PublishAsJSON_Invalid(t *testing.T) { s := newTestServer(t, newTestConfig(t)) body := `{"topic":"mytopic",INVALID` diff --git a/server/types.go b/server/types.go index fb08fb05..b26df1a3 100644 --- a/server/types.go +++ b/server/types.go @@ -105,6 +105,8 @@ type publishMessage struct { Filename string `json:"filename"` Email string `json:"email"` Call string `json:"call"` + Cache string `json:"cache"` // use string as it defaults to true (or use &bool instead) + Firebase string `json:"firebase"` // use string as it defaults to true (or use &bool instead) Delay string `json:"delay"` } From 49a548252c449282d8788ebf5e448f5e67b2e531 Mon Sep 17 00:00:00 2001 From: Nogweii Date: Tue, 25 Jun 2024 22:58:36 -0700 Subject: [PATCH 003/117] teach `ntfy webpush` to write the keys to a file --- .gitignore | 1 + cmd/webpush.go | 23 ++++++++++++++++++++++- cmd/webpush_test.go | 7 +++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7cbb52ac..cf10bc33 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ node_modules/ __pycache__ web/dev-dist/ venv/ +cmd/key-file.yaml diff --git a/cmd/webpush.go b/cmd/webpush.go index ec66f083..bd44f5aa 100644 --- a/cmd/webpush.go +++ b/cmd/webpush.go @@ -4,9 +4,16 @@ package cmd import ( "fmt" + "os" "github.com/SherClockHolmes/webpush-go" "github.com/urfave/cli/v2" + "github.com/urfave/cli/v2/altsrc" +) + +var flagsWebpush = append( + []cli.Flag{}, + altsrc.NewStringFlag(&cli.StringFlag{Name: "key-file", Aliases: []string{"f"}, Usage: "write vapid keys to this file"}), ) func init() { @@ -26,6 +33,7 @@ var cmdWebPush = &cli.Command{ Usage: "Generate VAPID keys to enable browser background push notifications", UsageText: "ntfy webpush keys", Category: categoryServer, + Flags: flagsWebpush, }, }, } @@ -35,7 +43,19 @@ func generateWebPushKeys(c *cli.Context) error { if err != nil { return err } - _, err = fmt.Fprintf(c.App.ErrWriter, `Web Push keys generated. Add the following lines to your config file: + + if keyFile := c.String("key-file"); keyFile != "" { + contents := fmt.Sprintf(`--- +web-push-public-key: %s +web-push-private-key: %s +`, publicKey, privateKey) + err = os.WriteFile(keyFile, []byte(contents), 0660) + if err != nil { + return err + } + _, err = fmt.Fprintf(c.App.ErrWriter, `Web Push keys written to %s.`, keyFile) + } else { + _, err = fmt.Fprintf(c.App.ErrWriter, `Web Push keys generated. Add the following lines to your config file: web-push-public-key: %s web-push-private-key: %s @@ -44,5 +64,6 @@ web-push-email-address: See https://ntfy.sh/docs/config/#web-push for details. `, publicKey, privateKey) + } return err } diff --git a/cmd/webpush_test.go b/cmd/webpush_test.go index 51926ca1..c2f19f6f 100644 --- a/cmd/webpush_test.go +++ b/cmd/webpush_test.go @@ -14,6 +14,13 @@ func TestCLI_WebPush_GenerateKeys(t *testing.T) { require.Contains(t, stderr.String(), "Web Push keys generated.") } +func TestCLI_WebPush_WriteKeysToFile(t *testing.T) { + app, _, _, stderr := newTestApp() + require.Nil(t, runWebPushCommand(app, server.NewConfig(), "keys", "--key-file=key-file.yaml")) + require.Contains(t, stderr.String(), "Web Push keys written to key-file.yaml") + require.FileExists(t, "key-file.yaml") +} + func runWebPushCommand(app *cli.App, conf *server.Config, args ...string) error { webPushArgs := []string{ "ntfy", From 20cca8e88840d75e8c774bcd8033d3ed22738aaa Mon Sep 17 00:00:00 2001 From: Nogweii Date: Tue, 25 Jun 2024 22:59:17 -0700 Subject: [PATCH 004/117] update go.sum --- go.sum | 57 ++------------------------------------------------------- 1 file changed, 2 insertions(+), 55 deletions(-) diff --git a/go.sum b/go.sum index 52702b33..ae11632e 100644 --- a/go.sum +++ b/go.sum @@ -1,32 +1,18 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw= -cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= cloud.google.com/go v0.113.0 h1:g3C70mn3lWfckKBiCVsAshabrDg01pQ0pnX1MNtnMkA= cloud.google.com/go v0.113.0/go.mod h1:glEqlogERKYeePz6ZdkcLJ28Q2I6aERgDDErBg9GzO8= -cloud.google.com/go/auth v0.3.0 h1:PRyzEpGfx/Z9e8+lHsbkoUVXD0gnu4MNmm7Gp8TQNIs= -cloud.google.com/go/auth v0.3.0/go.mod h1:lBv6NKTWp8E3LPzmO1TbiiRKc4drLOfHsgmlH9ogv5w= -cloud.google.com/go/auth v0.4.0 h1:vcJWEguhY8KuiHoSs/udg1JtIRYm3YAWPBE1moF1m3U= -cloud.google.com/go/auth v0.4.0/go.mod h1:tO/chJN3obc5AbRYFQDsuFbL4wW5y8LfbPtDCfgwOVE= cloud.google.com/go/auth v0.4.1 h1:Z7YNIhlWRtrnKlZke7z3GMqzvuYzdc2z98F9D1NV5Hg= cloud.google.com/go/auth v0.4.1/go.mod h1:QVBuVEKpCn4Zp58hzRGvL0tjRGU0YqdRTdCHM1IHnro= cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= -cloud.google.com/go/compute v1.26.0 h1:uHf0NN2nvxl1Gh4QO83yRCOdMK4zivtMS5gv0dEX0hg= -cloud.google.com/go/compute v1.26.0/go.mod h1:T9RIRap4pVHCGUkVFRJ9hygT3KCXjip41X1GgWtBBII= cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/firestore v1.15.0 h1:/k8ppuWOtNuDHt2tsRV42yI21uaGnKDEQnRFeBpbFF8= cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= -cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM= -cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= -cloud.google.com/go/longrunning v0.5.6 h1:xAe8+0YaWoCKr9t1+aWe+OeQgN/iJK1fEgZSXmjuEaE= -cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU= cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng= -cloud.google.com/go/storage v1.40.0 h1:VEpDQV5CJxFmJ6ueWNsKxcr1QAYOXEgxDa+sBbJahPw= -cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g= cloud.google.com/go/storage v1.41.0 h1:RusiwatSu6lHeEXe3kglxakAmAbfV+rhtPqA6i8RBx0= cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCepp5vR6Sq80= firebase.google.com/go/v4 v4.14.0 h1:Tc9jWzMUApUFUA5UUx/HcBeZ+LPjlhG2vNRfWJrcMwU= @@ -104,9 +90,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -114,8 +99,6 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= -github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= @@ -136,8 +119,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -164,8 +145,6 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stripe/stripe-go/v74 v74.30.0 h1:0Kf0KkeFnY7iRhOwvTerX0Ia1BRw+eV1CVJ51mGYAUY= github.com/stripe/stripe-go/v74 v74.30.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= -github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho= -github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/urfave/cli/v2 v2.27.2 h1:6e0H+AkS+zDckwPCUrZkKX38mRaau4nL2uipkJpbkcI= github.com/urfave/cli/v2 v2.27.2/go.mod h1:g0+79LmHHATl7DAcHO99smiR/T7uGLw84w8Y42x+4eM= github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= @@ -181,17 +160,14 @@ go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= -go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= -go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 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.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -212,13 +188,9 @@ golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= -golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -239,16 +211,12 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -258,8 +226,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= @@ -276,36 +242,19 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.176.1 h1:DJSXnV6An+NhJ1J+GWtoF2nHEuqB1VNoTfnIbjNvwD4= -google.golang.org/api v0.176.1/go.mod h1:j2MaSDYcvYV1lkZ1+SMW4IeF90SrEyFA+tluDYWRrFg= -google.golang.org/api v0.178.0 h1:yoW/QMI4bRVCHF+NWOTa4cL8MoWL3Jnuc7FlcFF91Ok= -google.golang.org/api v0.178.0/go.mod h1:84/k2v8DFpDRebpGcooklv/lais3MEfqpaBLA12gl2U= google.golang.org/api v0.180.0 h1:M2D87Yo0rGBPWpo1orwfCLehUUL6E7/TYe5gvMQWDh4= google.golang.org/api v0.180.0/go.mod h1:51AiyoEg1MJPSZ9zvklA8VnRILPXxn1iVen9v25XHAE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine/v2 v2.0.6 h1:LvPZLGuchSBslPBp+LAhihBeGSiRh1myRoYK4NtuBIw= google.golang.org/appengine/v2 v2.0.6/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240415180920-8c6c420018be h1:g4aX8SUFA8V5F4LrSY5EclyGYw1OZN4HS1jTyjB9ZDc= -google.golang.org/genproto v0.0.0-20240415180920-8c6c420018be/go.mod h1:FeSdT5fk+lkxatqJP38MsUicGqHax5cLtmy/6TAuxO4= -google.golang.org/genproto v0.0.0-20240506185236-b8a5c65736ae h1:HjgkYCl6cWQEKSHkpUp4Q8VB74swzyBwTz1wtTzahm0= -google.golang.org/genproto v0.0.0-20240506185236-b8a5c65736ae/go.mod h1:i4np6Wrjp8EujFAUn0CM0SH+iZhY1EbrfzEIJbFkHFM= google.golang.org/genproto v0.0.0-20240513163218-0867130af1f8 h1:XpH03M6PDRKTo1oGfZBXu2SzwcbfxUokgobVinuUZoU= google.golang.org/genproto v0.0.0-20240513163218-0867130af1f8/go.mod h1:OLh2Ylz+WlYAJaSBRpJIJLP8iQP+8da+fpxbwNEAV/o= -google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be h1:Zz7rLWqp0ApfsR/l7+zSHhY3PMiH2xqgxlfYfAfNpoU= -google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be/go.mod h1:dvdCTIoAGbkWbcIKBniID56/7XHTt6WfxXNMxuziJ+w= -google.golang.org/genproto/googleapis/api v0.0.0-20240506185236-b8a5c65736ae h1:AH34z6WAGVNkllnKs5raNq3yRq93VnjBG6rpfub/jYk= -google.golang.org/genproto/googleapis/api v0.0.0-20240506185236-b8a5c65736ae/go.mod h1:FfiGhwUm6CJviekPrc0oJ+7h29e+DmWU6UtjX0ZvI7Y= google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 h1:W5Xj/70xIA4x60O/IFyXivR5MGqblAb8R3w26pnD6No= google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8/go.mod h1:vPrPUTsDCYxXWjP7clS81mZ6/803D8K4iM9Ma27VKas= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be h1:LG9vZxsWGOmUKieR8wPAUR3u3MpnYFQZROPIMaXh7/A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240506185236-b8a5c65736ae h1:c55+MER4zkBS14uJhSZMGGmya0yJx5iHV4x/fpOSNRk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240506185236-b8a5c65736ae/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 h1:mxSlqyb8ZAHsYDCfiXN1EDdNTdvjUJSLY+OnAUtYNYA= google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -326,8 +275,6 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 903ef71b6f956731521992c3ee7983d186f7c48a Mon Sep 17 00:00:00 2001 From: lexi Date: Sun, 22 Sep 2024 11:58:26 +0200 Subject: [PATCH 005/117] Fix typo "Firebase (FCM" -> "Firebase (FCM)" --- docs/config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/config.md b/docs/config.md index 5fc1b6e5..878bf9c7 100644 --- a/docs/config.md +++ b/docs/config.md @@ -1374,7 +1374,7 @@ variable before running the `ntfy` command (e.g. `export NTFY_LISTEN_HTTP=:80`). | `listen-unix-mode` | `NTFY_LISTEN_UNIX_MODE` | *file mode* | *system default* | File mode of the Unix socket, e.g. 0700 or 0777 | | `key-file` | `NTFY_KEY_FILE` | *filename* | - | HTTPS/TLS private key file, only used if `listen-https` is set. | | `cert-file` | `NTFY_CERT_FILE` | *filename* | - | HTTPS/TLS certificate file, only used if `listen-https` is set. | -| `firebase-key-file` | `NTFY_FIREBASE_KEY_FILE` | *filename* | - | If set, also publish messages to a Firebase Cloud Messaging (FCM) topic for your app. This is optional and only required to save battery when using the Android app. See [Firebase (FCM](#firebase-fcm). | +| `firebase-key-file` | `NTFY_FIREBASE_KEY_FILE` | *filename* | - | If set, also publish messages to a Firebase Cloud Messaging (FCM) topic for your app. This is optional and only required to save battery when using the Android app. See [Firebase (FCM)](#firebase-fcm). | | `cache-file` | `NTFY_CACHE_FILE` | *filename* | - | If set, messages are cached in a local SQLite database instead of only in-memory. This allows for service restarts without losing messages in support of the since= parameter. See [message cache](#message-cache). | | `cache-duration` | `NTFY_CACHE_DURATION` | *duration* | 12h | Duration for which messages will be buffered before they are deleted. This is required to support the `since=...` and `poll=1` parameter. Set this to `0` to disable the cache entirely. | | `cache-startup-queries` | `NTFY_CACHE_STARTUP_QUERIES` | *string (SQL queries)* | - | SQL queries to run during database startup; this is useful for tuning and [enabling WAL mode](#wal-for-message-cache) | From b843c69c16d0115946beb507d051bbfe783dd4b8 Mon Sep 17 00:00:00 2001 From: Quantum Date: Wed, 16 Oct 2024 21:59:32 -0400 Subject: [PATCH 006/117] docs: add quantum5/ntfy-run to integrations and examples --- docs/examples.md | 6 ++++++ docs/integrations.md | 1 + 2 files changed, 7 insertions(+) diff --git a/docs/examples.md b/docs/examples.md index d6f83f30..8f2442fd 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -31,6 +31,12 @@ GitHub have been hopeless. In case it ever becomes available, I want to know imm */6 * * * * if curl -s https://api.github.com/users/ntfy | grep "Not Found"; then curl -d "github.com/ntfy is available" -H "Tags: tada" -H "Prio: high" ntfy.sh/my-alerts; fi ``` +You can also use [`ntfy-run`](https://github.com/quantum5/ntfy-run) to send the output of your cronjob in the +notification, so that you know exactly why it failed: + +``` +0 0 * * * ntfy-run -n https://ntfy.sh/backups --success-priority low --failure-tags warning ~/backup-computer +``` ## Low disk space alerts Here's a simple cronjob that I use to alert me when the disk space on the root disk is running low. It's simple, but diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..b25dab40 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -146,6 +146,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfy-java](https://github.com/MaheshBabu11/ntfy-java/) - A Java package to interact with a ntfy server (Java) - [container-update-check](https://github.com/stendler/container-update-check) - Scripts to check and notify if a podman or docker container image can be updated (Podman/Shell) - [ignition-combustion-template](https://github.com/stendler/ignition-combustion-template) - Templates and scripts to generate a configuration to automatically setup a system on first boot. Including systemd-ntfy-poweronoff (Shell) +- [ntfy-run](https://github.com/quantum5/ntfy-run) - Tool to run a command, capture its output, and send it to ntfy (Rust) ## Blog + forum posts From 90f21ba4081dbb63be48f1a83bbdfe5de1861c2d Mon Sep 17 00:00:00 2001 From: jim3692 <31220180+jim3692@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:48:32 +0200 Subject: [PATCH 007/117] Add Clipboard IO to projects --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..608952e5 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -146,6 +146,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfy-java](https://github.com/MaheshBabu11/ntfy-java/) - A Java package to interact with a ntfy server (Java) - [container-update-check](https://github.com/stendler/container-update-check) - Scripts to check and notify if a podman or docker container image can be updated (Podman/Shell) - [ignition-combustion-template](https://github.com/stendler/ignition-combustion-template) - Templates and scripts to generate a configuration to automatically setup a system on first boot. Including systemd-ntfy-poweronoff (Shell) +- [Clipboard IO](https://github.com/jim3692/clipboard-io) - End to end encrypted clipboard ## Blog + forum posts From c844c24a16ff17c9987264a1dc20679809c99737 Mon Sep 17 00:00:00 2001 From: KuroSetsuna29 Date: Sat, 2 Nov 2024 00:22:40 -0400 Subject: [PATCH 008/117] allow configurable web push expiry duration --- cmd/serve.go | 16 ++++++++++++++++ docs/config.md | 6 ++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/cmd/serve.go b/cmd/serve.go index 62e0a14a..871a5aec 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -100,6 +100,8 @@ var flagsServe = append( altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-file", Aliases: []string{"web_push_file"}, EnvVars: []string{"NTFY_WEB_PUSH_FILE"}, Usage: "file used to store web push subscriptions"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-email-address", Aliases: []string{"web_push_email_address"}, EnvVars: []string{"NTFY_WEB_PUSH_EMAIL_ADDRESS"}, Usage: "e-mail address of sender, required to use browser push services"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-startup-queries", Aliases: []string{"web_push_startup_queries"}, EnvVars: []string{"NTFY_WEB_PUSH_STARTUP_QUERIES"}, Usage: "queries run when the web push database is initialized"}), + altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-expiry-duration", Aliases: []string{"web_push_expiry_duration"}, EnvVars: []string{"NTFY_WEB_PUSH_EXPIRY_DURATION"}, Value: util.FormatDuration(server.DefaultWebPushExpiryDuration), Usage: "send web push warning notification after this time before expiring unused subscriptions"}), + altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-expiry-warning-duration", Aliases: []string{"web_push_expiry_warning_duration"}, EnvVars: []string{"NTFY_WEB_PUSH_EXPIRY_WARNING_DURATION"}, Value: util.FormatDuration(server.DefaultWebPushExpiryWarningDuration), Usage: "automatically expire unused subscriptions after this time"}), ) var cmdServe = &cli.Command{ @@ -140,6 +142,8 @@ func execServe(c *cli.Context) error { webPushFile := c.String("web-push-file") webPushEmailAddress := c.String("web-push-email-address") webPushStartupQueries := c.String("web-push-startup-queries") + webPushExpiryDurationStr := c.String("web-push-expiry-duration") + webPushExpiryWarningDurationStr := c.String("web-push-expiry-warning-duration") cacheFile := c.String("cache-file") cacheDurationStr := c.String("cache-duration") cacheStartupQueries := c.String("cache-startup-queries") @@ -226,6 +230,14 @@ func execServe(c *cli.Context) error { if err != nil { return fmt.Errorf("invalid visitor email limit replenish: %s", visitorEmailLimitReplenishStr) } + webPushExpiryDuration, err := util.ParseDuration(webPushExpiryDurationStr) + if err != nil { + return fmt.Errorf("invalid web push expiry duration: %s", webPushExpiryDurationStr) + } + webPushExpiryWarningDuration, err := util.ParseDuration(webPushExpiryWarningDurationStr) + if err != nil { + return fmt.Errorf("invalid web push expiry warning duration: %s", webPushExpiryWarningDurationStr) + } // Convert sizes to bytes messageSizeLimit, err := util.ParseSize(messageSizeLimitStr) @@ -304,6 +316,8 @@ func execServe(c *cli.Context) error { if messageSizeLimit > 5*1024*1024 { return errors.New("message-size-limit cannot be higher than 5M") } + } else if webPushExpiryWarningDuration > 0 && webPushExpiryWarningDuration > webPushExpiryDuration { + return errors.New("web push expiry warning duration cannot be higher than web push expiry duration") } // Backwards compatibility @@ -417,6 +431,8 @@ func execServe(c *cli.Context) error { conf.WebPushFile = webPushFile conf.WebPushEmailAddress = webPushEmailAddress conf.WebPushStartupQueries = webPushStartupQueries + conf.WebPushExpiryDuration = webPushExpiryDuration + conf.WebPushExpiryWarningDuration = webPushExpiryWarningDuration // Set up hot-reloading of config go sigHandlerConfigReload(config) diff --git a/docs/config.md b/docs/config.md index 9479301a..303173b9 100644 --- a/docs/config.md +++ b/docs/config.md @@ -876,7 +876,9 @@ a database to keep track of the browser's subscriptions, and an admin email addr - `web-push-private-key` is the generated VAPID private key, e.g. AA2BB1234567890abcdefzxcvbnm1234567890 - `web-push-file` is a database file to keep track of browser subscription endpoints, e.g. `/var/cache/ntfy/webpush.db` - `web-push-email-address` is the admin email address send to the push provider, e.g. `sysadmin@example.com` -- `web-push-startup-queries` is an optional list of queries to run on startup` +- `web-push-startup-queries` is an optional list of queries to run on startup` +- `web-push-expiry-warning-duration` defines the duration for which unused subscriptions are sent a warning (default is `7d`) +- `web-push-expiry-duration` defines the duration for which unused subscriptions will expire (default is `9d`) Limitations: @@ -904,7 +906,7 @@ web-push-email-address: sysadmin@example.com ``` The `web-push-file` is used to store the push subscriptions. Unused subscriptions will send out a warning after 7 days, -and will automatically expire after 9 days (not configurable). If the gateway returns an error (e.g. 410 Gone when a user has unsubscribed), +and will automatically expire after 9 days (default). If the gateway returns an error (e.g. 410 Gone when a user has unsubscribed), subscriptions are also removed automatically. The web app refreshes subscriptions on start and regularly on an interval, but this file should be persisted across restarts. If the subscription From 136b656ccbb2d17f0155112899c3196a254641e7 Mon Sep 17 00:00:00 2001 From: KuroSetsuna29 Date: Sat, 2 Nov 2024 08:50:57 -0400 Subject: [PATCH 009/117] fix descriptions --- cmd/serve.go | 4 ++-- docs/config.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/serve.go b/cmd/serve.go index 871a5aec..48cd19a0 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -100,8 +100,8 @@ var flagsServe = append( altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-file", Aliases: []string{"web_push_file"}, EnvVars: []string{"NTFY_WEB_PUSH_FILE"}, Usage: "file used to store web push subscriptions"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-email-address", Aliases: []string{"web_push_email_address"}, EnvVars: []string{"NTFY_WEB_PUSH_EMAIL_ADDRESS"}, Usage: "e-mail address of sender, required to use browser push services"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-startup-queries", Aliases: []string{"web_push_startup_queries"}, EnvVars: []string{"NTFY_WEB_PUSH_STARTUP_QUERIES"}, Usage: "queries run when the web push database is initialized"}), - altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-expiry-duration", Aliases: []string{"web_push_expiry_duration"}, EnvVars: []string{"NTFY_WEB_PUSH_EXPIRY_DURATION"}, Value: util.FormatDuration(server.DefaultWebPushExpiryDuration), Usage: "send web push warning notification after this time before expiring unused subscriptions"}), - altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-expiry-warning-duration", Aliases: []string{"web_push_expiry_warning_duration"}, EnvVars: []string{"NTFY_WEB_PUSH_EXPIRY_WARNING_DURATION"}, Value: util.FormatDuration(server.DefaultWebPushExpiryWarningDuration), Usage: "automatically expire unused subscriptions after this time"}), + altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-expiry-duration", Aliases: []string{"web_push_expiry_duration"}, EnvVars: []string{"NTFY_WEB_PUSH_EXPIRY_DURATION"}, Value: util.FormatDuration(server.DefaultWebPushExpiryDuration), Usage: "automatically expire unused subscriptions after this time"}), + altsrc.NewStringFlag(&cli.StringFlag{Name: "web-push-expiry-warning-duration", Aliases: []string{"web_push_expiry_warning_duration"}, EnvVars: []string{"NTFY_WEB_PUSH_EXPIRY_WARNING_DURATION"}, Value: util.FormatDuration(server.DefaultWebPushExpiryWarningDuration), Usage: "send web push warning notification after this time before expiring unused subscriptions"}), ) var cmdServe = &cli.Command{ diff --git a/docs/config.md b/docs/config.md index 303173b9..e04d72c5 100644 --- a/docs/config.md +++ b/docs/config.md @@ -877,8 +877,8 @@ a database to keep track of the browser's subscriptions, and an admin email addr - `web-push-file` is a database file to keep track of browser subscription endpoints, e.g. `/var/cache/ntfy/webpush.db` - `web-push-email-address` is the admin email address send to the push provider, e.g. `sysadmin@example.com` - `web-push-startup-queries` is an optional list of queries to run on startup` -- `web-push-expiry-warning-duration` defines the duration for which unused subscriptions are sent a warning (default is `7d`) -- `web-push-expiry-duration` defines the duration for which unused subscriptions will expire (default is `9d`) +- `web-push-expiry-warning-duration` defines the duration after which unused subscriptions are sent a warning (default is `7d`) +- `web-push-expiry-duration` defines the duration after which unused subscriptions will expire (default is `9d`) Limitations: From 9241b0550c503546546c2eb5e8b442ec0e1abab2 Mon Sep 17 00:00:00 2001 From: Hunter Kehoe Date: Mon, 4 Nov 2024 21:33:35 -0700 Subject: [PATCH 010/117] feat: add subscribe param --- docs/releases.md | 1 + docs/subscribe/api.md | 8 ++++++++ server/message_cache.go | 17 +++++++++++++++++ server/message_cache_test.go | 5 +++++ server/server.go | 6 ++++-- server/server_test.go | 5 +++++ server/types.go | 11 ++++++++--- 7 files changed, 48 insertions(+), 5 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 69222b82..7a1e9ede 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1378,6 +1378,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Features:** * Add username/password auth to email publishing ([#1164](https://github.com/binwiederhier/ntfy/pull/1164), thanks to [@bishtawi](https://github.com/bishtawi)) +* Add `latest` subscription param for grabbing just the most recent message (thanks to [@wunter8](https://github.com/wunter8)) **Bug fixes + maintenance:** diff --git a/docs/subscribe/api.md b/docs/subscribe/api.md index 3f1c0e81..2387c663 100644 --- a/docs/subscribe/api.md +++ b/docs/subscribe/api.md @@ -257,6 +257,14 @@ curl -s "ntfy.sh/mytopic/json?since=1645970742" curl -s "ntfy.sh/mytopic/json?since=nFS3knfcQ1xe" ``` +### Fetch latest message +If you only want the most recent message sent to a topic and do not have a message ID or timestamp to use with +`since=`, you can use `since=latest` to grab the most recent message from the cache for a particular topic. + +``` +curl -s "ntfy.sh/mytopic/json?poll=1&since=latest" +``` + ### Fetch scheduled messages Messages that are [scheduled to be delivered](../publish.md#scheduled-delivery) at a later date are not typically returned when subscribing via the API, which makes sense, because after all, the messages have technically not been diff --git a/server/message_cache.go b/server/message_cache.go index 4f677816..e314ace3 100644 --- a/server/message_cache.go +++ b/server/message_cache.go @@ -99,6 +99,13 @@ const ( WHERE topic = ? AND (id > ? OR published = 0) ORDER BY time, id ` + selectMessagesLatestQuery = ` + SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding + FROM messages + WHERE topic = ? AND published = 1 + ORDER BY time DESC, id DESC + LIMIT 1 + ` selectMessagesDueQuery = ` SELECT mid, time, expires, topic, message, title, priority, tags, click, icon, actions, attachment_name, attachment_type, attachment_size, attachment_expires, attachment_url, sender, user, content_type, encoding FROM messages @@ -416,6 +423,8 @@ func (c *messageCache) addMessages(ms []*message) error { func (c *messageCache) Messages(topic string, since sinceMarker, scheduled bool) ([]*message, error) { if since.IsNone() { return make([]*message, 0), nil + } else if since.IsLatest() { + return c.messagesLatest(topic) } else if since.IsID() { return c.messagesSinceID(topic, since, scheduled) } @@ -462,6 +471,14 @@ func (c *messageCache) messagesSinceID(topic string, since sinceMarker, schedule return readMessages(rows) } +func (c *messageCache) messagesLatest(topic string) ([]*message, error) { + rows, err := c.db.Query(selectMessagesLatestQuery, topic) + if err != nil { + return nil, err + } + return readMessages(rows) +} + func (c *messageCache) MessagesDue() ([]*message, error) { rows, err := c.db.Query(selectMessagesDueQuery, time.Now().Unix()) if err != nil { diff --git a/server/message_cache_test.go b/server/message_cache_test.go index 589ecc42..778f28fe 100644 --- a/server/message_cache_test.go +++ b/server/message_cache_test.go @@ -66,6 +66,11 @@ func testCacheMessages(t *testing.T, c *messageCache) { require.Equal(t, 1, len(messages)) require.Equal(t, "my other message", messages[0].Message) + // mytopic: latest + messages, _ = c.Messages("mytopic", sinceLatestMessage, false) + require.Equal(t, 1, len(messages)) + require.Equal(t, "my other message", messages[0].Message) + // example: count counts, err = c.MessageCounts() require.Nil(t, err) diff --git a/server/server.go b/server/server.go index ee2da76a..9a7f9d43 100644 --- a/server/server.go +++ b/server/server.go @@ -1556,8 +1556,8 @@ func (s *Server) sendOldMessages(topics []*topic, since sinceMarker, scheduled b // parseSince returns a timestamp identifying the time span from which cached messages should be received. // -// Values in the "since=..." parameter can be either a unix timestamp or a duration (e.g. 12h), or -// "all" for all messages. +// Values in the "since=..." parameter can be either a unix timestamp or a duration (e.g. 12h), +// "all" for all messages, or "latest" for the most recent message for a topic func parseSince(r *http.Request, poll bool) (sinceMarker, error) { since := readParam(r, "x-since", "since", "si") @@ -1569,6 +1569,8 @@ func parseSince(r *http.Request, poll bool) (sinceMarker, error) { return sinceNoMessages, nil } else if since == "all" { return sinceAllMessages, nil + } else if since == "latest" { + return sinceLatestMessage, nil } else if since == "none" { return sinceNoMessages, nil } diff --git a/server/server_test.go b/server/server_test.go index 75379f8f..7fbbeb85 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -594,6 +594,11 @@ func TestServer_PublishAndPollSince(t *testing.T) { require.Equal(t, 1, len(messages)) require.Equal(t, "test 2", messages[0].Message) + response = request(t, s, "GET", "/mytopic/json?poll=1&since=latest", "", nil) + messages = toMessages(t, response.Body.String()) + require.Equal(t, 1, len(messages)) + require.Equal(t, "test 2", messages[0].Message) + response = request(t, s, "GET", "/mytopic/json?poll=1&since=INVALID", "", nil) require.Equal(t, 40008, toHTTPError(t, response.Body.String()).Code) } diff --git a/server/types.go b/server/types.go index fb08fb05..c6bdb4d1 100644 --- a/server/types.go +++ b/server/types.go @@ -169,8 +169,12 @@ func (t sinceMarker) IsNone() bool { return t == sinceNoMessages } +func (t sinceMarker) IsLatest() bool { + return t == sinceLatestMessage +} + func (t sinceMarker) IsID() bool { - return t.id != "" + return t.id != "" && t.id != "latest" } func (t sinceMarker) Time() time.Time { @@ -182,8 +186,9 @@ func (t sinceMarker) ID() string { } var ( - sinceAllMessages = sinceMarker{time.Unix(0, 0), ""} - sinceNoMessages = sinceMarker{time.Unix(1, 0), ""} + sinceAllMessages = sinceMarker{time.Unix(0, 0), ""} + sinceNoMessages = sinceMarker{time.Unix(1, 0), ""} + sinceLatestMessage = sinceMarker{time.Unix(0, 0), "latest"} ) type queryFilter struct { From 8feb0f1a2e625ad83492ca490eafcf3072068a35 Mon Sep 17 00:00:00 2001 From: Dmitry Gudkov <30697406+dmitrygudkov@users.noreply.github.com> Date: Tue, 19 Nov 2024 21:28:59 -0500 Subject: [PATCH 011/117] Update integrations.md: Added EasyMorph EasyMorph (https://easymorph.com) is a visual workflow-based data preparation and automation tool. It has 180+ actions, including a dedicated action to send notifications to ntfy as a workflow step. The proposed link leads to the official help page for the "Send message to ntfy" action. --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..4806c50c 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -26,6 +26,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [Cloudron](https://www.cloudron.io/store/sh.ntfy.cloudronapp.html) - Platform that makes it easy to manage web apps on your server - [Xitoring](https://xitoring.com/docs/notifications/notification-roles/ntfy/) - Server and Uptime monitoring - [HetrixTools](https://docs.hetrixtools.com/ntfy-sh-notifications/) - Uptime monitoring +- [EasyMorph](https://help.easymorph.com/doku.php?id=transformations:sendntfymessage) - Visual data transformation and automation tool ## Integration via HTTP/SMTP/etc. From 19f8a3558824056b1118bd28f45180feab72c66c Mon Sep 17 00:00:00 2001 From: Scott Edlund Date: Sat, 23 Nov 2024 13:24:24 +0700 Subject: [PATCH 012/117] docs: publish.md typo --- docs/publish.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/publish.md b/docs/publish.md index 460fcd35..37b46809 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -1007,7 +1007,7 @@ Here's an **easier example with a shorter JSON payload**: === "Command line (curl)" ``` - # To use { and } in the URL without encoding, we need to turn of + # To use { and } in the URL without encoding, we need to turn off # curl's globbing using --globoff curl \ From 27398e7d72f5fb8a93ff8861fda5b5f20fce5697 Mon Sep 17 00:00:00 2001 From: David Wronek Date: Tue, 10 Dec 2024 08:40:36 +0100 Subject: [PATCH 013/117] docs: config.md: fix typo Add a missing parenthesis. Signed-off-by: David Wronek --- docs/config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/config.md b/docs/config.md index 9479301a..6e9ccb6f 100644 --- a/docs/config.md +++ b/docs/config.md @@ -1379,7 +1379,7 @@ variable before running the `ntfy` command (e.g. `export NTFY_LISTEN_HTTP=:80`). | `listen-unix-mode` | `NTFY_LISTEN_UNIX_MODE` | *file mode* | *system default* | File mode of the Unix socket, e.g. 0700 or 0777 | | `key-file` | `NTFY_KEY_FILE` | *filename* | - | HTTPS/TLS private key file, only used if `listen-https` is set. | | `cert-file` | `NTFY_CERT_FILE` | *filename* | - | HTTPS/TLS certificate file, only used if `listen-https` is set. | -| `firebase-key-file` | `NTFY_FIREBASE_KEY_FILE` | *filename* | - | If set, also publish messages to a Firebase Cloud Messaging (FCM) topic for your app. This is optional and only required to save battery when using the Android app. See [Firebase (FCM](#firebase-fcm). | +| `firebase-key-file` | `NTFY_FIREBASE_KEY_FILE` | *filename* | - | If set, also publish messages to a Firebase Cloud Messaging (FCM) topic for your app. This is optional and only required to save battery when using the Android app. See [Firebase (FCM)](#firebase-fcm). | | `cache-file` | `NTFY_CACHE_FILE` | *filename* | - | If set, messages are cached in a local SQLite database instead of only in-memory. This allows for service restarts without losing messages in support of the since= parameter. See [message cache](#message-cache). | | `cache-duration` | `NTFY_CACHE_DURATION` | *duration* | 12h | Duration for which messages will be buffered before they are deleted. This is required to support the `since=...` and `poll=1` parameter. Set this to `0` to disable the cache entirely. | | `cache-startup-queries` | `NTFY_CACHE_STARTUP_QUERIES` | *string (SQL queries)* | - | SQL queries to run during database startup; this is useful for tuning and [enabling WAL mode](#wal-for-message-cache) | From 4c179b7d9d7644b1edf41b0abca9f1534605c441 Mon Sep 17 00:00:00 2001 From: thiswillbeyourgithub <26625900+thiswillbeyourgithub@users.noreply.github.com> Date: Wed, 11 Dec 2024 12:40:36 +0100 Subject: [PATCH 014/117] docs: add ToC to integrations.md Signed-off-by: thiswillbeyourgithub <26625900+thiswillbeyourgithub@users.noreply.github.com> --- docs/integrations.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..0745c633 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -4,6 +4,16 @@ There are quite a few projects that work with ntfy, integrate ntfy, or have been I've added a ⭐ to projects or posts that have a significant following, or had a lot of interaction by the community. +## Table of Contents +- [Official integrations](#official-integrations) +- [Integration via HTTP/SMTP/etc.](#integration-via-httpsmtpetc) +- [UnifiedPush integrations](#unifiedpush-integrations) +- [Libraries](#libraries) +- [CLIs + GUIs](#clis--guis) +- [Projects + scripts](#projects--scripts) +- [Blog + forum posts](#blog--forum-posts) +- [Alternative ntfy servers](#alternative-ntfy-servers) + ## Official integrations - [changedetection.io](https://changedetection.io) ⭐ - Website change detection and notification From 758828e7aaa3c3294d46798eab752361e514916d Mon Sep 17 00:00:00 2001 From: thiswillbeyourgithub <26625900+thiswillbeyourgithub@users.noreply.github.com> Date: Wed, 11 Dec 2024 12:48:01 +0100 Subject: [PATCH 015/117] docs: add integration: Daily Fact Ntfy Signed-off-by: thiswillbeyourgithub <26625900+thiswillbeyourgithub@users.noreply.github.com> --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..51740b66 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -74,6 +74,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfyr](https://github.com/haxwithaxe/ntfyr) - A simple commandline tool to send notifications to ntfy - [ntfy.py](https://github.com/ioqy/ntfy-client-python) - ntfy.py is a simple nfty.sh client for sending notifications - [wlzntfy](https://github.com/Walzen-Group/ntfy-toaster) - A minimalistic, receive-only toast notification client for Windows 11 +- [Daily Fact Ntfy](https://github.com/thiswillbeyourgithub/Daily_Fact_Ntfy) - Generate [llm](https://github.com/simonw/llm) generated fact every day about any topic you're interested in. ## Projects + scripts From 80bc600ff0c2662fa1c6205fe44695129f0e0c7b Mon Sep 17 00:00:00 2001 From: thiswillbeyourgithub <26625900+thiswillbeyourgithub@users.noreply.github.com> Date: Wed, 11 Dec 2024 12:48:01 +0100 Subject: [PATCH 016/117] docs: add integration: Ntfy_CSV_Reminders Signed-off-by: thiswillbeyourgithub <26625900+thiswillbeyourgithub@users.noreply.github.com> --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..4510e78b 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -74,6 +74,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfyr](https://github.com/haxwithaxe/ntfyr) - A simple commandline tool to send notifications to ntfy - [ntfy.py](https://github.com/ioqy/ntfy-client-python) - ntfy.py is a simple nfty.sh client for sending notifications - [wlzntfy](https://github.com/Walzen-Group/ntfy-toaster) - A minimalistic, receive-only toast notification client for Windows 11 +- [Ntfy_CSV_Reminders](https://github.com/thiswillbeyourgithub/Ntfy_CSV_Reminders) - A Python tool that sends random-timing phone notifications for recurring tasks by using daily probability checks based on CSV-defined frequencies. ## Projects + scripts From 6345e7f864cfcafc48e3d62c6cf0963dbbc7a8a9 Mon Sep 17 00:00:00 2001 From: Kyle Duren Date: Wed, 1 Jan 2025 22:08:30 -0500 Subject: [PATCH 017/117] Update quickstart example Just noticed the behind proxy was missing from the example that was supposed to include it. --- docs/config.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/config.md b/docs/config.md index 9479301a..10bb78e6 100644 --- a/docs/config.md +++ b/docs/config.md @@ -50,6 +50,7 @@ Here are a few working sample configs using a `/etc/ntfy/server.yml` file: listen-http: ":2586" cache-file: "/var/cache/ntfy/cache.db" attachment-cache-dir: "/var/cache/ntfy/attachments" + behind-proxy: true ``` === "server.yml (ntfy.sh config)" From 5822a2ec410eafe9271a24aee946697a04cebcd6 Mon Sep 17 00:00:00 2001 From: David Havlicek Date: Fri, 17 Jan 2025 13:26:22 -0800 Subject: [PATCH 018/117] add canary in the cage podcast coverage to integrations page --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..d402f032 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -246,6 +246,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfy otro sistema de notificaciones pub-sub simple basado en HTTP](https://ugeek.github.io/blog/post/2021-11-05-ntfy-sh-otro-sistema-de-notificaciones-pub-sub-simple-basado-en-http.html) - ugeek.github.io - 11/2021 - [Show HN: A tool to send push notifications to your phone, written in Go](https://news.ycombinator.com/item?id=29715464) ⭐ - news.ycombinator.com - 12/2021 - [Reddit selfhostable post](https://www.reddit.com/r/selfhosted/comments/qxlsm9/my_open_source_notification_android_app_and/) ⭐ - reddit.com - 11/2021 +- [ntfy on The Canary in the Cage Podcast](https://odysee.com/@TheCanaryInTheCage:b/The-Canary-in-the-Cage-Episode-42:1?r=4gitYjTacQqPEjf22874USecDQYJ5y5E&t=3062) - odysee.com - 1/2025 ## Alternative ntfy servers From 2344eee2c6c8f59f6c170310330f408d5b809e01 Mon Sep 17 00:00:00 2001 From: Christian Harke Date: Mon, 20 Jan 2025 21:20:50 +0100 Subject: [PATCH 019/117] Make markdown code blocks scrollable --- web/src/components/Notifications.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/web/src/components/Notifications.jsx b/web/src/components/Notifications.jsx index 0b8b2e7d..dceb5b91 100644 --- a/web/src/components/Notifications.jsx +++ b/web/src/components/Notifications.jsx @@ -189,6 +189,7 @@ const MarkdownContainer = styled("div")` } pre { + overflow-x: scroll; padding: 0.9rem; } From f739a3067e9f3ddc32c3545ce73cc528b1e0285d Mon Sep 17 00:00:00 2001 From: Brian <18603393+brian6932@users.noreply.github.com> Date: Fri, 24 Jan 2025 20:28:29 -0500 Subject: [PATCH 020/117] docs: Typo `wep` -> `web` --- docs/config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/config.md b/docs/config.md index 9479301a..d4766cde 100644 --- a/docs/config.md +++ b/docs/config.md @@ -865,7 +865,7 @@ it'll show `New message` as a popup. ## Web Push [Web Push](https://developer.mozilla.org/en-US/docs/Web/API/Push_API) ([RFC8030](https://datatracker.ietf.org/doc/html/rfc8030)) allows ntfy to receive push notifications, even when the ntfy web app (or even the browser, depending on the platform) is closed. -When enabled, the user can enable **background notifications** for their topics in the wep app under Settings. Once enabled by the +When enabled, the user can enable **background notifications** for their topics in the web app under Settings. Once enabled by the user, ntfy will forward published messages to the push endpoint (browser-provided, e.g. fcm.googleapis.com), which will then forward it to the browser. From bd39cf4b54f1959808b6416266ea94ee42b9d95e Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Sun, 26 Jan 2025 00:00:06 +0100 Subject: [PATCH 021/117] server/util.go: fix logic in extractIPAddress() --- server/util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/util.go b/server/util.go index bcfe3037..73434cf7 100644 --- a/server/util.go +++ b/server/util.go @@ -82,7 +82,7 @@ func extractIPAddress(r *http.Request, behindProxy bool) netip.Addr { ip, err = netip.ParseAddr(remoteAddr) if err != nil { ip = netip.IPv4Unspecified() - if remoteAddr != "@" || !behindProxy { // RemoteAddr is @ when unix socket is used + if remoteAddr != "@" && !behindProxy { // RemoteAddr is @ when unix socket is used logr(r).Err(err).Warn("unable to parse IP (%s), new visitor with unspecified IP (0.0.0.0) created", remoteAddr) } } From 35458230a87d983b6444da9e1e40b8bdc85ee405 Mon Sep 17 00:00:00 2001 From: RoboMagus <68224306+RoboMagus@users.noreply.github.com> Date: Thu, 30 Jan 2025 23:49:22 +0100 Subject: [PATCH 022/117] add major and minor version tags to docker release flow --- .goreleaser.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.goreleaser.yml b/.goreleaser.yml index 062cce1f..2e248fca 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -197,3 +197,15 @@ docker_manifests: - *arm64v8_image - *armv7_image - *armv6_image + - name_template: "binwiederhier/ntfy:v{{ .Major }}" + image_templates: + - *amd64_image + - *arm64v8_image + - *armv7_image + - *armv6_image + - name_template: "binwiederhier/ntfy:v{{ .Major }}.{{ .Minor }}" + image_templates: + - *amd64_image + - *arm64v8_image + - *armv7_image + - *armv6_image \ No newline at end of file From 6b2cfb1d1d76a58629d205883924c6655e10cd3e Mon Sep 17 00:00:00 2001 From: barart <16019687+barart@users.noreply.github.com> Date: Wed, 5 Mar 2025 13:04:21 -0600 Subject: [PATCH 023/117] Handle anonymous read restrictions by sending a poll_request event If a topic does not allow anonymous reads, this change ensures that we send a "poll_request" event instead of relaying the message via Firebase. Additionally, we include generic text in the title and body/message. This way, if the client cannot retrieve the actual message, the user will still receive a notification, prompting them to update the client manually. --- server/server_firebase.go | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/server/server_firebase.go b/server/server_firebase.go index 4a0cb7f9..aff96db7 100644 --- a/server/server_firebase.go +++ b/server/server_firebase.go @@ -175,13 +175,26 @@ func toFirebaseMessage(m *message, auther user.Auther) (*messaging.Message, erro } else { // If anonymous read for a topic is not allowed, we cannot send the message along // via Firebase. Instead, we send a "poll_request" message, asking the client to poll. + //App function needs all the data to create a message object, if not, it fails, + //so we set it but put a placeholders to not to send the actual message + //but generic title and message instead, we also add the poll_id so client knowns + //what message is goint to "decode" (retrieve) data = map[string]string{ - "id": m.ID, - "time": fmt.Sprintf("%d", m.Time), - "event": pollRequestEvent, - "topic": m.Topic, - } - // TODO Handle APNS? + "id": m.ID, + "time": fmt.Sprintf("%d", m.Time), + "event": pollRequestEvent, + "topic": m.Topic, + "priority": fmt.Sprintf("%d", m.Priority), + "tags": strings.Join(m.Tags, ","), + "click": m.Click, + "icon": m.Icon, + "title": "Private", + "message": "Message", + "content_type": m.ContentType, + "encoding": m.Encoding, + "poll_id": m.ID, + } + apnsConfig = createAPNSAlertConfig(m, data) } } var androidConfig *messaging.AndroidConfig @@ -225,14 +238,23 @@ func createAPNSAlertConfig(m *message, data map[string]string) *messaging.APNSCo for k, v := range data { apnsData[k] = v } + alertTitle := m.Title + alertBody := maybeTruncateAPNSBodyMessage(m.Message) + // If the event is pollRequestEvent (server/topic is restricted) we dont want to + //send the actual message to Firebase/APNS, so we send a generic text + //if for some reason, client cant retrieve the message, it shows this as the message and title + if event, ok := data["event"]; ok && event == pollRequestEvent { + alertTitle = "New Notification received" + alertBody = "Message cant be retrieved, open the app and refresh content" + } return &messaging.APNSConfig{ Payload: &messaging.APNSPayload{ CustomData: apnsData, Aps: &messaging.Aps{ MutableContent: true, Alert: &messaging.ApsAlert{ - Title: m.Title, - Body: maybeTruncateAPNSBodyMessage(m.Message), + Title: alertTitle, + Body: alertBody, }, }, }, From 6af8d0347038a02bec831b9046b7eedf9d65f93a Mon Sep 17 00:00:00 2001 From: Sharjeel Aziz Date: Wed, 19 Mar 2025 15:35:46 -0400 Subject: [PATCH 024/117] Add Terminal Notifications for Long-Running Commands example Signed-off-by: Sharjeel Aziz --- docs/examples.md | 59 ++++++++++++++++++ .../img/mobile-screenshot-notification.png | Bin 0 -> 72277 bytes 2 files changed, 59 insertions(+) create mode 100644 docs/static/img/mobile-screenshot-notification.png diff --git a/docs/examples.md b/docs/examples.md index d6f83f30..18523716 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -634,3 +634,62 @@ or by simply providing traccar with a valid username/password combination. phil mypass ``` + +## Terminal Notifications for Long-Running Commands + +This example provides a simple way to send notifications using [ntfy.sh](https://ntfy.sh) when a terminal command completes. It includes success or failure indicators based on the command's exit status. + +### Setup + +1. Store your ntfy.sh bearer token securely if access control is enabled: + + ```sh + echo "your_bearer_token_here" > ~/.ntfy_token + chmod 600 ~/.ntfy_token + ``` + +1. Add the following function and alias to your `.bashrc` or `.bash_profile`: + + ```sh + # Function for alert notifications using ntfy.sh + notify_via_ntfy() { + local exit_status=$? # Capture the exit status before doing anything else + local token=$(< ~/.ntfy_token) # Securely read the token + local status_icon="$([ $exit_status -eq 0 ] && echo magic_wand || echo warning)" + local last_command=$(history | tail -n1 | sed -e 's/^[[:space:]]*[0-9]\{1,\}[[:space:]]*//' -e 's/[;&|][[:space:]]*alert$//') + + curl -s -X POST "https://n.example.dev/alerts" \ + -H "Authorization: Bearer $token" \ + -H "Title: Terminal" \ + -H "X-Priority: 3" \ + -H "Tags: $status_icon" \ + -d "Command: $last_command (Exit: $exit_status)" + + echo "Tags: $status_icon" + echo "$last_command (Exit: $exit_status)" + } + + # Add an "alert" alias for long running commands using ntfy.sh + alias alert='notify_via_ntfy' + + ``` + +### Usage + +Run any long-running command and append `alert` to notify when it completes: + +```sh +sleep 10; alert +``` +![ntfy notifications on mobile device](static/img/mobile-screenshot-notification.png) + +**Notification Sent** with a success 🪄 (`magic_wand`) or failure ⚠️ (`warning`) tag. + +#### Simulating Failures + +To test failure notifications: + +```sh +false; alert # Always fails (exit 1) +ls --invalid; alert # Invalid option +cat nonexistent_file; alert # File not found \ No newline at end of file diff --git a/docs/static/img/mobile-screenshot-notification.png b/docs/static/img/mobile-screenshot-notification.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9147fc119bbd99d691f6eb9a39b41598744ba9 GIT binary patch literal 72277 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 z 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

?SAcZ6G zXe_2smBm=fvMmIO6m#L#MK6osaVMRk#f5DI(jw7{sz_zEm$+a0E;DmJ*VWZ&k%}i0 zM2ZmsEl1~bsdfexO;i^0*=#0-NERVGg>+|oF4F~~GpUY_)+Q?u3`Z*ng@92C2viUv zq7p11f=Fv?>#eumcIfyqSAXqm`CRtpmtJB-0EI5$2VlO-q_jl(9%WATee%#2$2QuWgw$#rYKSX0}j+@v)P3UUbK|`xy!B! zMyi-KkrqJ!1sFK(jI&;S_4R_*Z5^FeBWi4c=H~5xxbHWM7cXvYZVA{_Q&WA~?AaGx za(O5=0)RmH&wu*klTSSH-S1xe^s`SbdU-)QovyDRd-;`DoqpQvXP$ZLFAqN0*w~=i zIb`ybtH1iM(+)qXps}^3<+^YE>%<8Y=gvFxuDkBqvUzhLXdiRTF<ME{)Oj%>N9pAM5I7;OY@FD-S@kf7e3$F z(Oy|GV%AYdUw-+O2m(Y7n0-3$XxOs+owsKlaa3LX7zSWr;_Y|JW&)e*TK;+InW2Kr+eB=jK24_L-&@TMETziHiSE)?Edx$-Oje3eG~7kA!UHL_NOkxEHAZ@#|x)|-EF#buWja)rM< z`hU$kn?j-Bp@&Ys{E9EkJnDEv+hI_|nXb0SAN|Yxr~clwqmdaa6NzI_Jn_?)e6D`n z!Gc66Z!B4K$89(N!{;w6IL;#vJ=naxAs7lBGG*EoSN+q>BaRkOCY62N+BNt8@we|R zeIu3XiUeYZO`mq@=P#Rf_%TSdX7%dZesaU1hfMm$cdoU=761_P?|%QAXPCD&=xl4f{<`m0Bodcge9^u4+_m<-_gG|PZT%1RLlnM+s;?^3fcfIRTvpPqm6@l@MR(fZ&1tnN;UP|M$SN^Pk+=)JSNJsvmpy+2@>l!G*zajJ*IP zy6J_k8#a|pE?>6vpa~Nysz(YS3L^>%gBOo1MHGv^Rz*9v@A%P8H#qs+O+WZSbRa1 zy1(I}Y-e)gs`tj!)lHl>sx`?RftA=WqMze>ZH} z@bvuoC!ToHyb))vTDAPuR~P;C$3M99SN|J~REc(4TbqUTU3a~I+_A@vSr4`>i*>x#X22W==oqn2QzJuf6&Dt+(IO(bdjC3>JVAoxA6*UoL$9xp{NX{N{JA zQ+7a?rKS=QfMhbMJAe6$1AdipM92X2bR9G?8&E}+_GiU^*8=^C|V^><`4JX z{n#T9O`USsg%@5_QBk#e)v{L>zS!K>ndUQc+ zR9MKSe}3~1mMwc{_S~~(9x*GI%`SNH`JdhLqiiO1*7+CBnLBUm`|thjv4_Wu9(T&@ zIbcyR5CY+Js{NLq{$Rm`xt4m(}#n1mImC0Rl$rS)1>~yp>b+k0z zcH6B}r%pe8&c~aY8ee&N;s4(Ai>eVL=AL=>A%`4#;f3cv^Tgk_ZD}~`%#T}<=;XTOWvgy>* z<^%#EM6gguG=X;A!+p_yYnIVt>d*be*>~J_%kO@3?=}DNpP;Pf?OX2u{oUb!b-{(7 z6tHrR)4X#>CfO;P>&J{g_q+>Ue|f=*cbA=b+;Mf|CQX`fh&URR-1qzceddY39dqo7 z*WPri6$-j3GM+X{BobGD?O%|rf&eopLpW<(yg&k6H>$p>vU0_WW!Y>d7>W@J@2{9L z(15zNmyYY^XabNxSOt`jCKfOJVU&7MU__!K#oUq0Y-?>^yJOpmt(!J9H+E*zIg|fO z-8@uoXa`Fn|5C69u^6LtGsO{EAq8zx0aO+$1HeJ=;Ul1bR={C;9G>8Y-|b?@2F^IY-3efP{f{zFRPvkT_G^vsh-9d*RlF8g*S zTZ@Dzo_5;*`{gfQeQ9ATl{TqTM5?bJk;!Bl8tO@j3qjG_o4x>+g-<^I_#+P-KJAFh zuJ}&2rj~(DJf-W;f4Khsd;a;{!e^!*_u-yWacf)0%o9$$_@d8ORW}HrQ=F}T{DUW- zSg>m4@=22qIq@U2w`^E*=k2$S7}a#vxfd}h@rtj(7zT&{3#0Jb4I8ey`X>h*bO^I{ z-P5iAx$fcn?tba{g&#V(2~ifk^1{4-KXB0Gsh3@ORZV?^0G%|uaK|lwzUijF+~|K|EcD*Ne+ zzhc{IgSu@Qrgk`k_)DooN3{|ZO)ur z?FdHXilltS=&*?iiLAp8JL1U04qy1>6I-^noN@MrRy=_~UUrL_nFT=v#Y~og2oWLo$Idvxj1kzD zI_cz7QrT(-M9@>F9+F5Ta#htw9X*|a1R7qrgt*zQ`CLT3v)Qsa#5VCWwEYG@pJ=@s9NSxUt$SJ(nKo6YRK z*Mudny|lGub5-3)5hA2qE<5|Q)2&!SgCJRxryN>eU$<`UYOOT_KlQ|X1#;Fo=cRM? zLJAR5>D(EgIP=*j=ZovrC6fmnc;JHhb2o3^JPAk;*yK?F z85M&<)A5hSnt0Va(?K}(&}sWkp6Ut%qKYMtoj&8?`|eu3X0=)H1@q@2$ec6Itgaiy zf`}YTBu+l{WAo-c^wi^zopZrwlF6*8W>20vZPEc#4P-+so}4~o#v}LMxpvK31nB5! zfA*;-rcRzbbLIyD2?<5Rv_lU+ceHY7!qTP7es}$^^rt`b@PiM`I_c!Yj+zdnP(p}- z#ulP7E%uD2n;(djcJ&!&op+geb})S2G}L072|lc+-N1 zw6F^zam%tSTPXkn0#kgU5Sx72PKNsj0<%|%N*sWWk=IRL!8(avGZ2tqO)RBk$Ru6K zWP*T8g}lqGEt^22fc79@2u+3!kwvy_X>MuRGI6hcGPznnWriX(eGae{Xs1z5PMs@k^gLQjt+xOU~LQg>HRSKHlp-X_WhX5+u) z+q-+Z@-167j%?Zkfu3Q}^2Uz;t!3Qe?(@rJUpuGZEF^*1mDw+8Dtj58h`dv%+GA1=p`x z1xPDbtrY>#tN=!i8ktNcnHiA;Bpy$s)9KAynngg764pDWw+4Tf5I_kOy1Un{US*R! zIe+d;FTE@xf&$Dfo8CgAm8;eOlSLR#W|=Q(Z*K#DY&L6@9w}n++Vj5t&C64ntiO~> zi=a|qrP#x;Pz|HTeeUyLy!MAz{p8y3H|;Uu>~qgYWor=y%5OE6{_dGYfK)tPHDRBu zc;nUFp9YuSZO7$-y<9fux=ucyN2GT`KXHH9Ek+3#{XcAl`W;Arg=YjB(m9(f2efuv zh01ix8Zbz)EhT8`m1e4&EG1r)YY>Pr)Ie;IDZI35kX;Ri!2;VOm2F+dalpz0%SbW7 zT9rmNt>rZM2aLtyxooDZv#qC8u&qSUw^(jr6amo+z;#Nl*6Bac4(IM=X&*+eRR#r(FcJY489cBFnP;H4`F2W<^9SAnZDBPq90b$l7*NYZF9) zQnnStWFpgwTLnCz1Qr(2h(L-;u8X8F6i7Ob+uhxhO~&kaoDoPgh%hseaz#W70h2Dx zd-%bd|9ZpbmgZQ(vXmtdFBQ7bKq2%oC(%!HI07@Po7PxLr zZC#<%!{CzG%8Jc8@uayA+|$~!>6BAuTXqZqC^SYVepr`IXTE;fm3QBD$Nc&8?)dv{ z?%!^%t84t=2ah}J-1FnPYNaf!^!riBEjdof>FVnG$3N~66*t8WB4Vwx)wLx?0Gm*u zU_2HlA|xLLiM3M715*iYKadJ7Gt7V@LhR~dp;+iC+_O1CS*k#_n2(+*emoxmT*PxPyqS1qm$M76DhgCSClt z+m!(#mBB|8gW^*O@N~5vg6CqANlbtO4ar<>EK_tG@P^3ItEvcSr38S4%&a^56Nwy* zu7!Xg%OD&Wj!Me0Nq_5t;a^9u@e2X6kQkk+Atc73HHv3*HRHzb`JXpm-}KhHaeL>? z_%srVh`5d-Si5EwYZ*PJDVa>$mfh9SDMsu2(XiHTcXxL(la9w@-arXeS~UY56i)G( z=1r*x#bnzielas2Y-T>pbPEt^MnHIK!6P^R@%nxDKk$-oUOIAAQ!-nVjK}}<`(NF4 z*X=;$f@URN=L8`O10pjk5CKtyBA}E?q*6WkLa|uP3efg#q~WWv~457uSv&J^HfCzqRL{6Eo>d zJe7Rt{(FA?tN-z)VEn-s0Y*X*ATm%tOoU+oDI!85KXNGVYF~j;Hj~@5@vZLee7aT} zOcxPm;g0qWMOHeU1%K+(dxb2)D>FkptR$VwILxP=bjsNmT%^T95rC4S7_flicqRj= z092{ebKiac%6Io9bJc(T^Pj$d&HnLZ#zJ(B1u!G@%!q`Dx%v_3U-ZQ@&bx5+s^xDi zS^W6CNACLj&0Dr?{Q7r)XsQ&(<1^b&qgHXtPQ;tW?eT+aucLSd7!eExxFDgZI4fXe zMl-krgl1fW$-|=}@i(jQqIqy+J3@ZZr>hyVgiLI1xUO;JkFLEgSyk_`f};?KD?)Yx zZOd#a7H{s9nGqnD%K>6XXNT`PF%p`WLMHX*4FLxxB;W#~*_qC|BaZGV74P}y?OeKm8;=gqdZW)Q7_6cB>@=9`NKD zjB!^1w>7N7VCK(Xd|_d+((tBAAR`#l`Gyr1+Of6si)L^+Q&YA%#2xM#!srQZ%QRon>TMZDQv93LPTL! zibOb=!W+scmA%J=z1v&cSFKnM;+hvBAgx=P*Q{AJrfF;es1A?_uh5#X{Voc-bITRy>jJ(H>RQiqEK&Ix9YdQy?)XGQ@(lmcRSlV{_=<46}$5&Y#O7n&jK|73u_=y77~eB z8UgJQcML&{7t+?&W?6PNn>Dj5@8lBwkd*)S*CNOg4ArQZBq#$~LX$`DQ58!Nkst~Z z18NUh63O7+D_|v>kVyo~h#}sntq1KA*cI$Gw1^?DVDjtw2$jbG%RtFwsSL#q95IgA z^kZzxJv`8pX`vHNJbBNFdq4WfgAd&E&q85s*pPS7A4T3a^XaN{44FZ zta<&0bwB&rHP>GAqkKmvYPY>*;|;(6-=@)HK6=JEA362(efK-y_P_o0&DUQGJGAWA zGZrkEf9co1{Lp=O=~B^PUlvP_<7zt|H!sApR6HJUZr+sd>e5;x+A%vh{n+WnV&RsX zZ_MZ0081i;uCA@O-tw0#F1_ThdHtX;Flbu}}yc8Hy|E8e*I#y>4v{AwT2dV|xb>)u)yi^bCEw6Gx3JJzBg zqT@J&KUPD4z7MWDn9)j;O7!q%L26X$$i1dKw&Vq^w5bZ3q9P$^pNSC#Egz@~LSrbE zxhn(0gk_|Ua0~)Le;A;kkdNZx_aYmFCPWq2>cGZ5>a7$o5Fv|rmmRc{9x-zCXTR{J zU;g~3zx(a=Pd)YYY4&LgpMUz_58T(h zY4haChdPeC@VO`6cyrnD$DMf8vD5wVfJ`rY8PgU~BMOm-cXe4;y#TQZuyK&^mu6z%RAPWfp^`<{R z^Thm>%a>mD{U5PPnAt!dKD>vjQxsOm4!2eO`NQ$!RFMR&F zjT_fraQ=n4bQ*Nw=9~WT*7|jqUishkBSr!6=fC)+E532b?|$>^tAF&fR3?jvf(po> zz`;KI?9f8dg+p-i(XxH@S)T8+jk!VL{vgC_H#G> zp*F9F$UjAs4w&-TV~_sw7uOwn#L!7-uoUPWPjq!b6$Dz<(qE!%j5$O7(Z?z3bLUD^bySW-~Rwq_HDP`yn6MT zgAP7;=8T!F-CJ(CY3?HrEq?WtA6@%%E1syV+Xl@_UK64>1Sbrr%z!~i{=JMLMHGXoshIC8l}baP3^P>=1_U5dF&7T18DAJ%cyj%s5_kZ^ z%F~}-gJ1xh8{oJI0hoCYzmr(J=*sN+@E9bBU$n2BU-2uh=v_q#+H4<~8+}lAOiaj3 zm4Fv13_4^NEdmEmJL+3k{qT<4{`S)I3txZjWmh}Ova4(B&N=tO*{6LhooiqK7D;5Q zFZ=e@xBl(Mr=MJ~Wbvy2SY2K7$xnXz^f_mt6$ca)jwMr7bt5e+P61*gQo6b}nX3*O z)+{1BnXIZGVJA|6NJ?dE>*JZMImPDjV)0b2rrxqG52g_nvRhSKZzoa$ia;MY<=}5z zcI6*`|NHyzxd&02#x-5^nTwY$Tefaf3t4eQM8b4cbtYTw9eY%ST8mESYO8DNjH8~+ z72w{r-2?Kl<>4 z2)eem=A3gbEIE3`sa_Te5V?YiE3XP9~G_LRJqd4efX$ zS3lB@CqXot?sEa9RHn8emP&gi9A%yNna|fXj=KN8d;j&%JA~a#GIi32Pnz?IPu7kY z!vF|67LVs@8e;J@d$?qP$dd=))(^J{=LWwT-Dv zj@T8Trm^F$_|Db0-h9)e^BxiXZvm)pX#DiWUp#5{#}F)LH=C>d%;)~=uQ&erwM8#3 zUGnM~XPpC>OJuTNy5!Q)O}9TfZ{D46+!0fdPG>*H=NM&mpl9?O|0$?njs;+CWZHtHn!A_Arv6KVk1lr=ETWATdZoW7ApZUGUrAUVq1(cYO6L->_ndT-~U6I?H~e z=#)dIoq6tsk3Bkf!DA0wh%;u)V5RojcfXfjd1;@0_p>akauVCund0d#rL0_CV>*-Z zenbGE-(0qcSx-CcXh0jl6?Osbw>csyH!4&ZNES8`MMd|)0N45LZ4VC8h{faai4!N< zwmq0gg+d)UD4?`x3%itlZvC=n*SyhzjzXfa4X-c;e&xeQmh~GfAq2=0{J_g_Q7F#^ z0mztFL_q;mNT@kuB@W1rIkbL!6~tWD=(BuO?uzYN6(q8RT>xgc)Vig4Td~w)i-*J%uhJ zipLWImVlsW)+MLp*zqKg4Wivr9?-I5N$~n0*>y_VEyNQkHr_4*vM%*>F{)T1jfg0W z!aY4bn>TN=Emc=n7mue(PRY@3Je~ry1hg*Z3BZb{G!UUBz=&Mx=~gVUWQvJc#6o1p z>FR9X+P1a2raF_&DzdwaMLlCB0qAkm%et(k1bvSY3ojvL*p0fdM|>q1YyZEK6` zIyJR*>0Aw?g`VEfmV!cee(ToF+I1T0>l2BT2$md2*)dXlT$#mK8Tp$|NA-7K+`d>{vW)pg$CVh+8W5w6<(^oMK&VZ8}{;mhFg; zvRtR6M4V!QY@2MG&=wG24eUClZc;H7%ZQl3TZ_2uZ7uEX?U{5gQ&nRpQU>SBDfX~i zBxREwH#t`VaGa8M9A#N(#e`WqB}B087?RQ=2&i4Bv%R&mqb(MXS5?&{QW*gSs66CN zVC|HgQjg1=scHZuU~S+I^Ie_ot*r!7TUTc%Q$jIRq+ORlN`-DkXvLEnm2uceT(?kQ zz<4sPy)iuyr|1;AdmJZ~tuA!uU8fiv0SIByi$}eO>2x}oj28-dW=SNofQH@&fyF6w z0a7B7(Tu_+?G`L$p_LK<3xU~1h$l1cavg;E*}12rNLzAdZsNT`e!Hd1Gx?OAnWrL{kVkIBX??HnMQP zmkDdi4D;Sk#pq`2bs2+eXqZAU32JmKd*I0N%ue6na)StR~Y5fORBjpE~(`zPPi2?pW-QH!A`Atc4@S{})Za)r$S77;`Rti35{ z5HgAz6r+gYCGqMUQil3uw#dWa(cw_DGFyUZqc91x8025&ib<28h(?3<>o<;>)>sU6 z%6S;K{Z}{0P6q}8imBd))~qed zv}pmN;ny}Z86aXh6tqEdE)%SJnOd)9kdasriGa1`!z~L@@M=&1nYEY_9C^#9MF9vg zp#JGKKUnzG0%8_KjY`0bWOcpfViXp!Goqo zFe@yEj)gsRY-IM1hJPZY-0TgE!1>O$%fI=xx`z7yzWOIXaRyd|1fWF=s$LTXuGUJ~ zAWR^NkVUk33=4pw2sJZ;@{@vs<_cbC9h;o3AHj>cX%GYt>{<6=Q~*H4LW5$>piB*y zyW6*1bm94jA9eKCFS`=KVg#?TZ5JoNcFd^s6pPDOEO%XZIHB*2XswIIqA@Cisi|lL zMj#3Hiy(ldaYC|g^gf5b)wN}9d-KM8Tbt8e@EiS2FC&(T@j{V@VA)0T)wdsB1kJ)w zZY)D0L>uj-va%GbwvuD38^$E7Q$om!L0l9KVi~r>A!3B02k?%j3pQv_)69PPh7A-2 ziv|{pNLT;^Z$?5U(VOTO0VE~f)0=y;1cb#mPQY3O1xOJIGMelTc{uPQq?8uJ+kr%W z@Qq4{khK|>Go#mr>laBGJa}V=34z%q1TnCWA_~!`qcWt0-qI7AE@28V?u|+Jc$y6y zC<2nwUN5nL!J3!eX;l#calJwrqT$^#n86-Mfk8|1bDLT)cv&i37+9VQ zkbs<-MTpes(M_hEQ+wpWA#w|EXwgMewL#RP5m5}Nzn`>VKN~G#b~pPLvix8265^D~ zRh@bEC$GEiCre*ny8r%D0f5D921co5x@NYB*uQCAUKuZy&R!=-OG?of~Hsehi`f!2b+H%CDdKs=6x z;CddP6nN8C;A?Mh3dIZO!RU1e`20M5;j=_~bRwEPsu;8T*~c}NK(9+cRV*Ii3iwm2 z1Y(ANOqCxDv!k%VLNj@B1W~}^;cB2^0ra}(y$Kl|@YEW(RWoe|D9B>so?yVH57Hs& zU8VC=&!(q9DzlnEA}m5)y^TDw9G?LUE8d%czZiapu^$QgH|akHV`z5;JYePez4=C9 z6*M4v)L`h1R+YyI#M_L%SM9Swg)4ntpAv-!GlM*dNO*ElBm^bzMPLDInjvoSDv$_9 z5o`Z=Nd+CV_dgCO077%iz9C1CCp~~P_vdfe+cKVpH{7Wx0wQ$koU=W;X%G{mc!$w= zLY~qg_BRQO4hTuXYc?^zpv!;v)(`yR(3RI`Wtgestx^)vMR+ zf51V8$}Qx0KsZ<_=jwuu;-5T}ps&TW6cYfj*X$C6j^b@0^mrx3^c*4k^rU^Gp7>kW zv+j=Tc6Ik$^tmsL7%`edok@L$6vNWMJs6GcIhTDIo}QkbaF_Y;)Kmh=WHJ*bOc=~_ zia)@p*lbJ@0A>6o^ju#=1VzS98&3y9Z=%d8>YqUG%7oi4c6pm1R1g~wCGe|%FN_&(5F(GGo&%dBV(60v!NtJ;0f8{}r9b53vC)8_?@v;w zz$Q?k_OK62+WUdG-EUa_xz{!65u!2rr^du<#-|kyN`VzcU3ol|?-nN_jBSjq5R>d% zBTE#@*em;5*1^xx7=AKCj3UN}lx38qYu{Qd5i-W4N!J$HvP@&i&e%n^ao_sF>1<#edb+uF~ToEg(4@S#1Mhgs&rozAJXmC%#kIS;!F zdf9P&*fawW>f%P3got(Lfo%TsRRm?X1`*G}5%XOV!6SEd)gL2Da5DiHthLO|DmtRk zVLan-XTzrVUNsBaHvwL>=-xN1c0E1;wx3}^MGkm)yTOkQs@1I7j#vjwIZQQHR=;-Y zSYuEC7sDkpHoz}!pac?G{~RfYVivd~*Dc|F!-(mlZS^UGmMy0kTkpfm(>v!PX+15- ztq?~_>hl^&hz`>UsjX?tvIB+law;AXYFh2Q1(*W2a%NAKIA-TJOhwkt<4f66P!A6X zoaGb!sPq}v1K7t#OV(w1J&w1k<7$CKe38^I1!uwz|_>~;jnwHa!g&v18_w7qlIIwD2iYbvkzWiGb>!7th~7v!OUrD z_LcV&sdL<5R9b}$MgkZGdlw!)KUVW^k;GkAi2qU zmEbjYIyb|GQB?J?_-wC6z81@b?$(6ko);^DB6=hXQbf@Xj7Au!?UtjKagzwTNLL;m_s7;dSr)Ib$z#s5+t#* zPBmu5&{uL;Wkp^wX#x$hsHm|x{q? zDi-e_=Dr50bc*7}IzGJn;RcWdSz;P^xM(uHP0Bohbu-y- ze7@b#-M{PAg}y&_%teR}YMcm*HL&ImxYe$?Jk|gnV|#3-uu^R2OW1E-9M{ieD9?S! zd3|gsg(VYLRO_}$H6BzSv0!237OsSh`i_<|*l+Tr&r5FC+WO=pFW3n}S?(jw=B?hh zjvA1oUhqc^cTd+7{d2k{>+9-3_WC?hM?NkYn|sa7-)NP}f)VqzJ@8FEfhek~TJEKd z-IvY!_9l6jBr4}mta*Xe!qU=dpgoB@__K##0|1obru}LevLkx%^Bp|UPV)ZC(Z7s9 zXik#QOxw+M8QFWGzAm&BFA7Y43t%e15Ue>SM}e_#No~-$bxINU#p;}DSIuk>V_BEV z-FxNgGe`lW!?n-=QaNpB#`h-O+-tecqLenj^5B8buXT&Rq zgv9QY^Do(me@~)noL$|zKru^P7&3Wl(VLO#Rnr(UZEV;xS27zyB)g4oIFOmKdF-$c zbVK^$qJK~jfHTan=^RPhePcAr|ICwm^J6(oW1B`sK4Ri$SCg3HO{h9Y?Yc}a|ELu|T-ynad@HQszFuQx%$^OO})&0s%p@(3B+%LX7HZ$s`ReE#REuJr~D&&6NYFrL$ARXxwKspLY;2&-_QH4#bk*KZdx^&`dU4Z1&gsxlyp| z#*sjq=WAD@Lm(-A!f)j;G}F8!Z24QFDL@%25`XMkTyRe?I-$vkEoD{Ef?PQ~O2qp!Q5!=L6?OrBe)u*o>^@`7 zzV}tHuvOm)$ot$>IJkp4xHfDdd~#367ww7x0AOFfeDSTuIt6v4wR#oo9K?7S;Ie?J zz+(dg>RzAlcXi%ma55IfMH;sY{i!>7^;iMJM@!I%Dj5N2qIUvjI>rCvRDa%-r?GF( z{1z~CymNkw%5!a{o4*##P@&u(asl8ORj$PP($Z3ZguEUJ1YAog$39o4sJhH>Pmpl#tqb3`bR62RXBL`g{f3Y*KaU+(!dQ)nVIhjv_IYzNY-6X!g(>sc6A&Jx4zy|?XRshiTtjh-`D)3I^mB8ieRkv-mXB!X| z@5Om)ad&4|VvkKOI0HVwnsowhoku_x>jw^OIDXAE1r=ENA(3C^w@Pf}zt&MIOX1$( zK$bIx4qHDt19t0?vgrU>Ncwe|>5ay{;c9;l%O4_?0ryv{Dhdct@TlAI#X)G49p?8L zq1~?jRG1A~9?Px>Ur$=ETt;Is^ILnXt3ktIk@EAdGrwGjp32Fs!D2uaFC~QsZfEYC zDVWq2d#q4`Zy($#_&ctee7wqLlCQsYDOpR6Uam*MYu7CYHIiw~h-b8+C(SF|YdF;C zi4&#}lDu@ORF9vww!CFJV*+Ohd^h%a$T*gUPH@$xbPNI~K2FaHWh zg_{O8BBsj?`(Ntrw4g(Ydr!Z44wHaUhv#v#i#TfpeSP4h?F^~gY@~4et=81GW3UTG zw&2IAnnH~7sAiI|MEb@1tEwCCbS)sdn%3myJCvK*F$}%S#c4M8Cv<^PkqK*mm7g6K zbg!Wp`)JWu^vFSK%9}(#EV^%+H~0=lLuOm;G=aIfL9drq|6Fn^FAlpwGtRHh>34sa zNJksub#5Db&6mZYe_;~%ao$c};kXTPl3}ndZnqB|R@+fMK~eemew6!(e)Ac|icSw{ z-=BRin=R3?E>hENaFT1S{2~9J(5!S&O|?!`G6zBgT=A^E9RB;xgm3nMlav2EGn1wW z`NY8UnkSb7wCK-jaEDqJWb(gzVV7g^fJq=MfW#S*hAI5B^9dfV z0o*>n6*#lPZO7kl1gy*df96hGZ>Em7ujZ0;EZtThY^9t YXT3XYM?y{>hcf|UW^@x?dCepCKakpsD*ylh literal 0 HcmV?d00001 From 889a6f03f8a489e33b5738c661eb320fcd12344d Mon Sep 17 00:00:00 2001 From: Christoph Vilsmeier Date: Tue, 25 Mar 2025 16:56:47 +0100 Subject: [PATCH 025/117] docs: add integration: Monibot --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..89ddcdb7 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -26,6 +26,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [Cloudron](https://www.cloudron.io/store/sh.ntfy.cloudronapp.html) - Platform that makes it easy to manage web apps on your server - [Xitoring](https://xitoring.com/docs/notifications/notification-roles/ntfy/) - Server and Uptime monitoring - [HetrixTools](https://docs.hetrixtools.com/ntfy-sh-notifications/) - Uptime monitoring +- [Monibot](https://monibot.io/) - Monibot monitors your websites, servers and applications and notifies you if something goes wrong. ## Integration via HTTP/SMTP/etc. From db9b974e47b0a2f8dab4c0fea9bcb9ff9bb4d8ad Mon Sep 17 00:00:00 2001 From: jlssmt <42897917+jlssmt@users.noreply.github.com> Date: Sun, 6 Apr 2025 11:32:20 +0200 Subject: [PATCH 026/117] set LABEL org.opencontainers.image.version --- Dockerfile-build | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dockerfile-build b/Dockerfile-build index 4530ec47..457c63ff 100644 --- a/Dockerfile-build +++ b/Dockerfile-build @@ -44,6 +44,8 @@ RUN make VERSION=$VERSION COMMIT=$COMMIT cli-linux-server FROM alpine +ARG VERSION=dev + LABEL org.opencontainers.image.authors="philipp.heckel@gmail.com" LABEL org.opencontainers.image.url="https://ntfy.sh/" LABEL org.opencontainers.image.documentation="https://docs.ntfy.sh/" @@ -52,6 +54,7 @@ LABEL org.opencontainers.image.vendor="Philipp C. Heckel" LABEL org.opencontainers.image.licenses="Apache-2.0, GPL-2.0" LABEL org.opencontainers.image.title="ntfy" LABEL org.opencontainers.image.description="Send push notifications to your phone or desktop using PUT/POST" +LABEL org.opencontainers.image.version="$VERSION" COPY --from=builder /app/dist/ntfy_linux_server/ntfy /usr/bin/ntfy From c9126e7aa9a32a2f47dce65da10be39d96541e03 Mon Sep 17 00:00:00 2001 From: Josh J Date: Mon, 7 Apr 2025 09:26:52 +0100 Subject: [PATCH 027/117] docs: correct mountPath for server.yml Fixed #1309 --- docs/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/install.md b/docs/install.md index 0c823571..45870505 100644 --- a/docs/install.md +++ b/docs/install.md @@ -540,7 +540,7 @@ kubectl apply -k /ntfy cpu: 150m memory: 150Mi volumeMounts: - - mountPath: /etc/ntfy/server.yml + - mountPath: /etc/ntfy subPath: server.yml name: config-volume # generated vie configMapGenerator from kustomization file - mountPath: /var/cache/ntfy From bd08a120cda0949769225f197fbd947245703018 Mon Sep 17 00:00:00 2001 From: Volker Krause Date: Mon, 7 Apr 2025 17:19:44 +0200 Subject: [PATCH 028/117] Consider aes128gcm content encoding as an indicator for UnifiedPush Without this a UnifiedPush/Web Push message with encryption would be turned into an attachment. That in itself isn't pretty but can still work, but it requires attachments to be enabled in the first place. --- server/server.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/server.go b/server/server.go index ee2da76a..8e2f6992 100644 --- a/server/server.go +++ b/server/server.go @@ -1025,7 +1025,8 @@ func (s *Server) parsePublishParams(r *http.Request, m *message) (cache bool, fi } template = readBoolParam(r, false, "x-template", "template", "tpl") unifiedpush = readBoolParam(r, false, "x-unifiedpush", "unifiedpush", "up") // see GET too! - if unifiedpush { + contentEncoding := readParam(r, "content-encoding") + if unifiedpush || contentEncoding == "aes128gcm" { firebase = false unifiedpush = true } From c1d718ee688742a7381c560deed2849b35603400 Mon Sep 17 00:00:00 2001 From: patricksthannon <153395657+patricksthannon@users.noreply.github.com> Date: Wed, 9 Apr 2025 09:53:17 -0700 Subject: [PATCH 029/117] Update integrations.md Added InvaderInformant integration to integration list. Thanks! --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..a47fa99e 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -146,6 +146,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfy-java](https://github.com/MaheshBabu11/ntfy-java/) - A Java package to interact with a ntfy server (Java) - [container-update-check](https://github.com/stendler/container-update-check) - Scripts to check and notify if a podman or docker container image can be updated (Podman/Shell) - [ignition-combustion-template](https://github.com/stendler/ignition-combustion-template) - Templates and scripts to generate a configuration to automatically setup a system on first boot. Including systemd-ntfy-poweronoff (Shell) +- [InvaderInformant](https://github.com/patricksthannon/InvaderInformant) - Script for Mac OS systems that monitors new or dropped connections to your network using ntfy (Shell) ## Blog + forum posts From d4dfd3f65780b7908d2f681e73c7e71aa06608ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robbie=20Bj=C3=B6rk?= Date: Sat, 26 Apr 2025 00:22:54 +0200 Subject: [PATCH 030/117] Update integrations.md Added alertmanager-ntfy-relay to integrations.md --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..f343aeef 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -82,6 +82,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [Grafana-to-ntfy](https://gitlab.com/Saibe1111/grafana-to-ntfy) - Grafana-to-ntfy alerts channel (Node Js) - [ntfy-long-zsh-command](https://github.com/robfox92/ntfy-long-zsh-command) - Notifies you once a long-running command completes (zsh) - [ntfy-shellscripts](https://github.com/nickexyz/ntfy-shellscripts) - A few scripts for the ntfy project (Shell) +- [alertmanager-ntfy-relay](https://github.com/therobbielee/alertmanager-ntfy-relay) - ntfy.sh relay for Alertmanager (Go) - [QuickStatus](https://github.com/corneliusroot/QuickStatus) - A shell script to alert to any immediate problems upon login (Shell) - [ntfy.el](https://github.com/shombando/ntfy) - Send notifications from Emacs (Emacs) - [backup-projects](https://gist.github.com/anthonyaxenov/826ba65abbabd5b00196bc3e6af76002) - Stupidly simple backup script for own projects (Shell) From 8b95b1a2134307ffb6cfd8fddb524c537d3f3dfc Mon Sep 17 00:00:00 2001 From: Yassir Hannoun Date: Sat, 26 Apr 2025 21:13:12 +0000 Subject: [PATCH 031/117] docs: Added UptimeObserver integration --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..b4d8154e 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -36,6 +36,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [Mailrise](https://github.com/YoRyan/mailrise) - An SMTP gateway (integration via [Apprise](https://github.com/caronc/apprise/wiki/Notify_ntfy)) - [Proxmox-Ntfy](https://github.com/qtsone/proxmox-ntfy) - Python script that monitors Proxmox tasks and sends notifications using the Ntfy service. - [Scrutiny](https://github.com/AnalogJ/scrutiny) - WebUI for smartd S.M.A.R.T monitoring. Scrutiny includes shoutrrr/ntfy integration ([see integration README](https://github.com/AnalogJ/scrutiny?tab=readme-ov-file#notifications)) +- [UptimeObserver](https://uptimeobserver.com) - Uptime Monitoring tool for Websites, APIs, SSL Certificates, DNS, Domain Names and Ports. [Integration Guide](https://support.uptimeobserver.com/integrations/ntfy/) ## [UnifiedPush](https://unifiedpush.org/users/apps/) integrations From 3f1342c05b21e1750db36f06f59507b30bf9cb4e Mon Sep 17 00:00:00 2001 From: gitmotion <43588713+gitmotion@users.noreply.github.com> Date: Mon, 28 Apr 2025 19:25:40 -0700 Subject: [PATCH 032/117] Add ntfy-me-mcp --- docs/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/integrations.md b/docs/integrations.md index a593bf36..8236122a 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -146,6 +146,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfy-java](https://github.com/MaheshBabu11/ntfy-java/) - A Java package to interact with a ntfy server (Java) - [container-update-check](https://github.com/stendler/container-update-check) - Scripts to check and notify if a podman or docker container image can be updated (Podman/Shell) - [ignition-combustion-template](https://github.com/stendler/ignition-combustion-template) - Templates and scripts to generate a configuration to automatically setup a system on first boot. Including systemd-ntfy-poweronoff (Shell) +- [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) - An ntfy MCP server for sending/fetching ntfy notifications to your self-hosted ntfy server from AI Agents (supports secure token auth & more - use with npx or docker!) (Node/Typescript) ## Blog + forum posts From f110472204c9d74a98e9ee8cb2ee35898fbe3dcb Mon Sep 17 00:00:00 2001 From: Hunter Kehoe Date: Wed, 14 May 2025 11:20:30 -0600 Subject: [PATCH 033/117] fix typo --- server/server.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/server.go b/server/server.go index ee2da76a..e66b9939 100644 --- a/server/server.go +++ b/server/server.go @@ -1885,14 +1885,14 @@ func (s *Server) transformMatrixJSON(next handleFunc) handleFunc { } func (s *Server) authorizeTopicWrite(next handleFunc) handleFunc { - return s.autorizeTopic(next, user.PermissionWrite) + return s.authorizeTopic(next, user.PermissionWrite) } func (s *Server) authorizeTopicRead(next handleFunc) handleFunc { - return s.autorizeTopic(next, user.PermissionRead) + return s.authorizeTopic(next, user.PermissionRead) } -func (s *Server) autorizeTopic(next handleFunc, perm user.Permission) handleFunc { +func (s *Server) authorizeTopic(next handleFunc, perm user.Permission) handleFunc { return func(w http.ResponseWriter, r *http.Request, v *visitor) error { if s.userManager == nil { return next(w, r, v) From cdae5493e267f8d3ac8167291f6e3d8d8d95a4bd Mon Sep 17 00:00:00 2001 From: Hunter Kehoe Date: Wed, 14 May 2025 11:39:18 -0600 Subject: [PATCH 034/117] write http errors to websocket connection instead of always 200 --- server/server.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/server.go b/server/server.go index e66b9939..68e20724 100644 --- a/server/server.go +++ b/server/server.go @@ -413,7 +413,8 @@ func (s *Server) handleError(w http.ResponseWriter, r *http.Request, v *visitor, } else { ev.Info("WebSocket error: %s", err.Error()) } - return // Do not attempt to write to upgraded connection + w.WriteHeader(httpErr.HTTPCode) + return // Do not attempt to write any body to upgraded connection } if isNormalError { ev.Debug("Connection closed with HTTP %d (ntfy error %d)", httpErr.HTTPCode, httpErr.Code) From 44b7c2f198f5171bf3f40a36b5efa2ae40402ce3 Mon Sep 17 00:00:00 2001 From: Tom Hubrecht Date: Tue, 20 May 2025 10:49:26 +0200 Subject: [PATCH 035/117] user: Allow changing the hashed password directly This adds the detection of `NTFY_PASSWORD_HASH` when creating a user or changing its passsword so that scripts don't have to manipulate the bare password. --- cmd/user.go | 37 +++++++++++------ server/server_account.go | 4 +- server/server_account_test.go | 24 +++++------ server/server_admin.go | 2 +- server/server_admin_test.go | 16 ++++---- server/server_payments_test.go | 18 ++++----- server/server_test.go | 32 +++++++-------- server/server_twilio_test.go | 8 ++-- server/server_webpush_test.go | 4 +- user/manager.go | 32 +++++++++++---- user/manager_test.go | 74 +++++++++++++++++++--------------- 11 files changed, 144 insertions(+), 107 deletions(-) diff --git a/cmd/user.go b/cmd/user.go index af3afe54..e6867b11 100644 --- a/cmd/user.go +++ b/cmd/user.go @@ -42,7 +42,7 @@ var cmdUser = &cli.Command{ Name: "add", Aliases: []string{"a"}, Usage: "Adds a new user", - UsageText: "ntfy user add [--role=admin|user] USERNAME\nNTFY_PASSWORD=... ntfy user add [--role=admin|user] USERNAME", + UsageText: "ntfy user add [--role=admin|user] USERNAME\nNTFY_PASSWORD=... ntfy user add [--role=admin|user] USERNAME\nNTFY_PASSWORD_HASH=... ntfy user add [--role=admin|user] USERNAME", Action: execUserAdd, Flags: []cli.Flag{ &cli.StringFlag{Name: "role", Aliases: []string{"r"}, Value: string(user.RoleUser), Usage: "user role"}, @@ -55,12 +55,13 @@ granted otherwise by the auth-default-access setting). An admin user has read an topics. Examples: - ntfy user add phil # Add regular user phil - ntfy user add --role=admin phil # Add admin user phil - NTFY_PASSWORD=... ntfy user add phil # Add user, using env variable to set password (for scripts) + ntfy user add phil # Add regular user phil + ntfy user add --role=admin phil # Add admin user phil + NTFY_PASSWORD=... ntfy user add phil # Add user, using env variable to set password (for scripts) + NTFY_PASSWORD_HASH=... ntfy user add phil # Add user, using env variable to set password hash (for scripts) -You may set the NTFY_PASSWORD environment variable to pass the password. This is useful if -you are creating users via scripts. +You may set the NTFY_PASSWORD environment variable to pass the password, or NTFY_PASSWORD_HASH to pass +directly the bcrypt hash. This is useful if you are creating users via scripts. `, }, { @@ -79,7 +80,7 @@ Example: Name: "change-pass", Aliases: []string{"chp"}, Usage: "Changes a user's password", - UsageText: "ntfy user change-pass USERNAME\nNTFY_PASSWORD=... ntfy user change-pass USERNAME", + UsageText: "ntfy user change-pass USERNAME\nNTFY_PASSWORD=... ntfy user change-pass USERNAME\nNTFY_PASSWORD_HASH=... ntfy user change-pass USERNAME", Action: execUserChangePass, Description: `Change the password for the given user. @@ -89,9 +90,10 @@ it twice. Example: ntfy user change-pass phil NTFY_PASSWORD=.. ntfy user change-pass phil + NTFY_PASSWORD_HASH=.. ntfy user change-pass phil -You may set the NTFY_PASSWORD environment variable to pass the new password. This is -useful if you are updating users via scripts. +You may set the NTFY_PASSWORD environment variable to pass the new password or NTFY_PASSWORD_HASH to pass +directly the bcrypt hash. This is useful if you are updating users via scripts. `, }, @@ -174,7 +176,12 @@ variable to pass the new password. This is useful if you are creating/updating u func execUserAdd(c *cli.Context) error { username := c.Args().Get(0) role := user.Role(c.String("role")) - password := os.Getenv("NTFY_PASSWORD") + password, hashed := os.LookupEnv("NTFY_PASSWORD_HASH") + + if !hashed { + password = os.Getenv("NTFY_PASSWORD") + } + if username == "" { return errors.New("username expected, type 'ntfy user add --help' for help") } else if username == userEveryone || username == user.Everyone { @@ -200,7 +207,7 @@ func execUserAdd(c *cli.Context) error { } password = p } - if err := manager.AddUser(username, password, role); err != nil { + if err := manager.AddUser(username, password, role, hashed); err != nil { return err } fmt.Fprintf(c.App.ErrWriter, "user %s added with role %s\n", username, role) @@ -230,7 +237,11 @@ func execUserDel(c *cli.Context) error { func execUserChangePass(c *cli.Context) error { username := c.Args().Get(0) - password := os.Getenv("NTFY_PASSWORD") + password, hashed := os.LookupEnv("NTFY_PASSWORD_HASH") + + if !hashed { + password = os.Getenv("NTFY_PASSWORD") + } if username == "" { return errors.New("username expected, type 'ntfy user change-pass --help' for help") } else if username == userEveryone || username == user.Everyone { @@ -249,7 +260,7 @@ func execUserChangePass(c *cli.Context) error { return err } } - if err := manager.ChangePassword(username, password); err != nil { + if err := manager.ChangePassword(username, password, hashed); err != nil { return err } fmt.Fprintf(c.App.ErrWriter, "changed password for user %s\n", username) diff --git a/server/server_account.go b/server/server_account.go index 3f2368da..acdf25ec 100644 --- a/server/server_account.go +++ b/server/server_account.go @@ -37,7 +37,7 @@ func (s *Server) handleAccountCreate(w http.ResponseWriter, r *http.Request, v * return errHTTPConflictUserExists } logvr(v, r).Tag(tagAccount).Field("user_name", newAccount.Username).Info("Creating user %s", newAccount.Username) - if err := s.userManager.AddUser(newAccount.Username, newAccount.Password, user.RoleUser); err != nil { + if err := s.userManager.AddUser(newAccount.Username, newAccount.Password, user.RoleUser, false); err != nil { if errors.Is(err, user.ErrInvalidArgument) { return errHTTPBadRequestInvalidUsername } @@ -207,7 +207,7 @@ func (s *Server) handleAccountPasswordChange(w http.ResponseWriter, r *http.Requ return errHTTPBadRequestIncorrectPasswordConfirmation } logvr(v, r).Tag(tagAccount).Debug("Changing password for user %s", u.Name) - if err := s.userManager.ChangePassword(u.Name, req.NewPassword); err != nil { + if err := s.userManager.ChangePassword(u.Name, req.NewPassword, false); err != nil { return err } return s.writeJSON(w, newSuccessResponse()) diff --git a/server/server_account_test.go b/server/server_account_test.go index 72ba55c9..91db1bc5 100644 --- a/server/server_account_test.go +++ b/server/server_account_test.go @@ -87,9 +87,9 @@ func TestAccount_Signup_AsUser(t *testing.T) { defer s.closeDatabases() log.Info("1") - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) log.Info("2") - require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser, false)) log.Info("3") rr := request(t, s, "POST", "/v1/account", `{"username":"emma", "password":"emma"}`, map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), @@ -174,7 +174,7 @@ func TestAccount_ChangeSettings(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) u, _ := s.userManager.User("phil") token, _ := s.userManager.CreateToken(u.ID, "", time.Unix(0, 0), netip.IPv4Unspecified()) @@ -203,7 +203,7 @@ func TestAccount_Subscription_AddUpdateDelete(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) rr := request(t, s, "POST", "/v1/account/subscription", `{"base_url": "http://abc.com", "topic": "def"}`, map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), @@ -254,7 +254,7 @@ func TestAccount_ChangePassword(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) rr := request(t, s, "POST", "/v1/account/password", `{"password": "WRONG", "new_password": ""}`, map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), @@ -296,7 +296,7 @@ func TestAccount_ExtendToken(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) rr := request(t, s, "POST", "/v1/account/token", "", map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), @@ -332,7 +332,7 @@ func TestAccount_ExtendToken_NoTokenProvided(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) rr := request(t, s, "PATCH", "/v1/account/token", "", map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), // Not Bearer! @@ -345,7 +345,7 @@ func TestAccount_DeleteToken(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) rr := request(t, s, "POST", "/v1/account/token", "", map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), @@ -455,14 +455,14 @@ func TestAccount_Reservation_AddAdminSuccess(t *testing.T) { Code: "pro", ReservationLimit: 2, })) - require.Nil(t, s.userManager.AddUser("noadmin1", "pass", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("noadmin1", "pass", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("noadmin1", "pro")) require.Nil(t, s.userManager.AddReservation("noadmin1", "mytopic", user.PermissionDenyAll)) - require.Nil(t, s.userManager.AddUser("noadmin2", "pass", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("noadmin2", "pass", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("noadmin2", "pro")) - require.Nil(t, s.userManager.AddUser("phil", "adminpass", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("phil", "adminpass", user.RoleAdmin, false)) // Admin can reserve topic rr := request(t, s, "POST", "/v1/account/reservation", `{"topic":"sometopic","everyone":"deny-all"}`, map[string]string{ @@ -624,7 +624,7 @@ func TestAccount_Reservation_Delete_Messages_And_Attachments(t *testing.T) { s := newTestServer(t, conf) // Create user with tier - require.Nil(t, s.userManager.AddUser("phil", "mypass", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "mypass", user.RoleUser, false)) require.Nil(t, s.userManager.AddTier(&user.Tier{ Code: "pro", MessageLimit: 20, diff --git a/server/server_admin.go b/server/server_admin.go index ac295718..49a4d4d9 100644 --- a/server/server_admin.go +++ b/server/server_admin.go @@ -60,7 +60,7 @@ func (s *Server) handleUsersAdd(w http.ResponseWriter, r *http.Request, v *visit return err } } - if err := s.userManager.AddUser(req.Username, req.Password, user.RoleUser); err != nil { + if err := s.userManager.AddUser(req.Username, req.Password, user.RoleUser, false); err != nil { return err } if tier != nil { diff --git a/server/server_admin_test.go b/server/server_admin_test.go index c2f8f95a..a8bc87e1 100644 --- a/server/server_admin_test.go +++ b/server/server_admin_test.go @@ -14,7 +14,7 @@ func TestUser_AddRemove(t *testing.T) { defer s.closeDatabases() // Create admin, tier - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) require.Nil(t, s.userManager.AddTier(&user.Tier{ Code: "tier1", })) @@ -56,8 +56,8 @@ func TestUser_AddRemove_Failures(t *testing.T) { defer s.closeDatabases() // Create admin - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) - require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) + require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser, false)) // Cannot create user with invalid username rr := request(t, s, "PUT", "/v1/users", `{"username": "not valid", "password":"ben"}`, map[string]string{ @@ -97,8 +97,8 @@ func TestAccess_AllowReset(t *testing.T) { defer s.closeDatabases() // User and admin - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) - require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) + require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser, false)) // Subscribing not allowed rr := request(t, s, "GET", "/gold/json?poll=1", "", map[string]string{ @@ -138,7 +138,7 @@ func TestAccess_AllowReset_NonAdminAttempt(t *testing.T) { defer s.closeDatabases() // User - require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser, false)) // Grant access fails, because non-admin rr := request(t, s, "POST", "/v1/users/access", `{"username": "ben", "topic":"gold", "permission":"ro"}`, map[string]string{ @@ -154,8 +154,8 @@ func TestAccess_AllowReset_KillConnection(t *testing.T) { defer s.closeDatabases() // User and admin, grant access to "gol*" topics - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) - require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) + require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser, false)) require.Nil(t, s.userManager.AllowAccess("ben", "gol*", user.PermissionRead)) // Wildcard! start, timeTaken := time.Now(), atomic.Int64{} diff --git a/server/server_payments_test.go b/server/server_payments_test.go index 8da47a65..56d4cc6a 100644 --- a/server/server_payments_test.go +++ b/server/server_payments_test.go @@ -148,7 +148,7 @@ func TestPayments_SubscriptionCreate_NotAStripeCustomer_Success(t *testing.T) { Code: "pro", StripeMonthlyPriceID: "price_123", })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) // Create subscription response := request(t, s, "POST", "/v1/account/billing/subscription", `{"tier": "pro", "interval": "month"}`, map[string]string{ @@ -184,7 +184,7 @@ func TestPayments_SubscriptionCreate_StripeCustomer_Success(t *testing.T) { Code: "pro", StripeMonthlyPriceID: "price_123", })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) u, err := s.userManager.User("phil") require.Nil(t, err) @@ -226,7 +226,7 @@ func TestPayments_AccountDelete_Cancels_Subscription(t *testing.T) { Code: "pro", StripeMonthlyPriceID: "price_123", })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) u, err := s.userManager.User("phil") require.Nil(t, err) @@ -280,7 +280,7 @@ func TestPayments_Checkout_Success_And_Increase_Rate_Limits_Reset_Visitor(t *tes MessageLimit: 220, // 220 * 5% = 11 requests before rate limiting kicks in MessageExpiryDuration: time.Hour, })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) // No tier + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) // No tier u, err := s.userManager.User("phil") require.Nil(t, err) @@ -461,7 +461,7 @@ func TestPayments_Webhook_Subscription_Updated_Downgrade_From_PastDue_To_Active( AttachmentTotalSizeLimit: 1000000, AttachmentBandwidthLimit: 1000000, })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "pro")) require.Nil(t, s.userManager.AddReservation("phil", "atopic", user.PermissionDenyAll)) require.Nil(t, s.userManager.AddReservation("phil", "ztopic", user.PermissionDenyAll)) @@ -570,7 +570,7 @@ func TestPayments_Webhook_Subscription_Deleted(t *testing.T) { StripeMonthlyPriceID: "price_1234", ReservationLimit: 1, })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "pro")) require.Nil(t, s.userManager.AddReservation("phil", "atopic", user.PermissionDenyAll)) @@ -658,7 +658,7 @@ func TestPayments_Subscription_Update_Different_Tier(t *testing.T) { StripeMonthlyPriceID: "price_456", StripeYearlyPriceID: "price_457", })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "pro")) require.Nil(t, s.userManager.ChangeBilling("phil", &user.Billing{ StripeCustomerID: "acct_123", @@ -690,7 +690,7 @@ func TestPayments_Subscription_Delete_At_Period_End(t *testing.T) { Return(&stripe.Subscription{}, nil) // Create user - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeBilling("phil", &user.Billing{ StripeCustomerID: "acct_123", StripeSubscriptionID: "sub_123", @@ -724,7 +724,7 @@ func TestPayments_CreatePortalSession(t *testing.T) { }, nil) // Create user - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeBilling("phil", &user.Billing{ StripeCustomerID: "acct_123", StripeSubscriptionID: "sub_123", diff --git a/server/server_test.go b/server/server_test.go index 75379f8f..88c88d1c 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -411,7 +411,7 @@ func TestServer_PublishAt_FromUser(t *testing.T) { t.Parallel() s := newTestServer(t, newTestConfigWithAuthFile(t)) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) response := request(t, s, "PUT", "/mytopic", "a message", map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), "In": "1h", @@ -781,7 +781,7 @@ func TestServer_Auth_Success_Admin(t *testing.T) { c := newTestConfigWithAuthFile(t) s := newTestServer(t, c) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) response := request(t, s, "GET", "/mytopic/auth", "", map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), @@ -795,7 +795,7 @@ func TestServer_Auth_Success_User(t *testing.T) { c.AuthDefault = user.PermissionDenyAll s := newTestServer(t, c) - require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser, false)) require.Nil(t, s.userManager.AllowAccess("ben", "mytopic", user.PermissionReadWrite)) response := request(t, s, "GET", "/mytopic/auth", "", map[string]string{ @@ -809,7 +809,7 @@ func TestServer_Auth_Success_User_MultipleTopics(t *testing.T) { c.AuthDefault = user.PermissionDenyAll s := newTestServer(t, c) - require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser, false)) require.Nil(t, s.userManager.AllowAccess("ben", "mytopic", user.PermissionReadWrite)) require.Nil(t, s.userManager.AllowAccess("ben", "anothertopic", user.PermissionReadWrite)) @@ -830,7 +830,7 @@ func TestServer_Auth_Fail_InvalidPass(t *testing.T) { c.AuthDefault = user.PermissionDenyAll s := newTestServer(t, c) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) response := request(t, s, "GET", "/mytopic/auth", "", map[string]string{ "Authorization": util.BasicAuth("phil", "INVALID"), @@ -843,7 +843,7 @@ func TestServer_Auth_Fail_Unauthorized(t *testing.T) { c.AuthDefault = user.PermissionDenyAll s := newTestServer(t, c) - require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser, false)) require.Nil(t, s.userManager.AllowAccess("ben", "sometopic", user.PermissionReadWrite)) // Not mytopic! response := request(t, s, "GET", "/mytopic/auth", "", map[string]string{ @@ -857,7 +857,7 @@ func TestServer_Auth_Fail_CannotPublish(t *testing.T) { c.AuthDefault = user.PermissionReadWrite // Open by default s := newTestServer(t, c) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) require.Nil(t, s.userManager.AllowAccess(user.Everyone, "private", user.PermissionDenyAll)) require.Nil(t, s.userManager.AllowAccess(user.Everyone, "announcements", user.PermissionRead)) @@ -906,7 +906,7 @@ func TestServer_Auth_ViaQuery(t *testing.T) { c.AuthDefault = user.PermissionDenyAll s := newTestServer(t, c) - require.Nil(t, s.userManager.AddUser("ben", "some pass", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("ben", "some pass", user.RoleAdmin, false)) u := fmt.Sprintf("/mytopic/json?poll=1&auth=%s", base64.RawURLEncoding.EncodeToString([]byte(util.BasicAuth("ben", "some pass")))) response := request(t, s, "GET", u, "", nil) @@ -954,8 +954,8 @@ func TestServer_StatsResetter(t *testing.T) { MessageLimit: 5, MessageExpiryDuration: -5 * time.Second, // Second, what a hack! })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) - require.Nil(t, s.userManager.AddUser("tieruser", "tieruser", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) + require.Nil(t, s.userManager.AddUser("tieruser", "tieruser", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("tieruser", "test")) // Send an anonymous message @@ -1099,7 +1099,7 @@ func TestServer_DailyMessageQuotaFromDatabase(t *testing.T) { require.Nil(t, s.userManager.AddTier(&user.Tier{ Code: "test", })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "test")) u, err := s.userManager.User("phil") @@ -1696,7 +1696,7 @@ func TestServer_PublishWithTierBasedMessageLimitAndExpiry(t *testing.T) { MessageLimit: 5, MessageExpiryDuration: -5 * time.Second, // Second, what a hack! })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "test")) // Publish to reach message limit @@ -1932,7 +1932,7 @@ func TestServer_PublishAttachmentWithTierBasedExpiry(t *testing.T) { AttachmentExpiryDuration: sevenDays, // 7 days AttachmentBandwidthLimit: 100000, })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "test")) // Publish and make sure we can retrieve it @@ -1977,7 +1977,7 @@ func TestServer_PublishAttachmentWithTierBasedBandwidthLimit(t *testing.T) { AttachmentExpiryDuration: time.Hour, AttachmentBandwidthLimit: 14000, // < 3x5000 bytes -> enough for one upload, one download })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "test")) // Publish and make sure we can retrieve it @@ -2015,7 +2015,7 @@ func TestServer_PublishAttachmentWithTierBasedLimits(t *testing.T) { AttachmentExpiryDuration: 30 * time.Second, AttachmentBandwidthLimit: 1000000, })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "test")) // Publish small file as anonymous @@ -2237,7 +2237,7 @@ func TestServer_AnonymousUser_And_NonTierUser_Are_Same_Visitor(t *testing.T) { defer s.closeDatabases() // Create user without tier - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) // Publish a message (anonymous user) rr := request(t, s, "POST", "/mytopic", "hi", nil) diff --git a/server/server_twilio_test.go b/server/server_twilio_test.go index 89a36051..2501916a 100644 --- a/server/server_twilio_test.go +++ b/server/server_twilio_test.go @@ -63,7 +63,7 @@ func TestServer_Twilio_Call_Add_Verify_Call_Delete_Success(t *testing.T) { MessageLimit: 10, CallLimit: 1, })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "pro")) u, err := s.userManager.User("phil") require.Nil(t, err) @@ -140,7 +140,7 @@ func TestServer_Twilio_Call_Success(t *testing.T) { MessageLimit: 10, CallLimit: 1, })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "pro")) u, err := s.userManager.User("phil") require.Nil(t, err) @@ -185,7 +185,7 @@ func TestServer_Twilio_Call_Success_With_Yes(t *testing.T) { MessageLimit: 10, CallLimit: 1, })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "pro")) u, err := s.userManager.User("phil") require.Nil(t, err) @@ -216,7 +216,7 @@ func TestServer_Twilio_Call_UnverifiedNumber(t *testing.T) { MessageLimit: 10, CallLimit: 1, })) - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleUser, false)) require.Nil(t, s.userManager.ChangeTier("phil", "pro")) // Do the thing diff --git a/server/server_webpush_test.go b/server/server_webpush_test.go index c32c7bf8..ab7a20c4 100644 --- a/server/server_webpush_test.go +++ b/server/server_webpush_test.go @@ -96,7 +96,7 @@ func TestServer_WebPush_TopicSubscribeProtected_Allowed(t *testing.T) { config.AuthDefault = user.PermissionDenyAll s := newTestServer(t, config) - require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser, false)) require.Nil(t, s.userManager.AllowAccess("ben", "test-topic", user.PermissionReadWrite)) response := request(t, s, "POST", "/v1/webpush", payloadForTopics(t, []string{"test-topic"}, testWebPushEndpoint), map[string]string{ @@ -126,7 +126,7 @@ func TestServer_WebPush_DeleteAccountUnsubscribe(t *testing.T) { config := configureAuth(t, newTestConfigWithWebPush(t)) s := newTestServer(t, config) - require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) + require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser, false)) require.Nil(t, s.userManager.AllowAccess("ben", "test-topic", user.PermissionReadWrite)) response := request(t, s, "POST", "/v1/webpush", payloadForTopics(t, []string{"test-topic"}, testWebPushEndpoint), map[string]string{ diff --git a/user/manager.go b/user/manager.go index 9f54625f..d691d42f 100644 --- a/user/manager.go +++ b/user/manager.go @@ -864,14 +864,23 @@ func (a *Manager) resolvePerms(base, perm Permission) error { } // AddUser adds a user with the given username, password and role -func (a *Manager) AddUser(username, password string, role Role) error { +func (a *Manager) AddUser(username, password string, role Role, hashed bool) error { if !AllowedUsername(username) || !AllowedRole(role) { return ErrInvalidArgument } - hash, err := bcrypt.GenerateFromPassword([]byte(password), a.bcryptCost) - if err != nil { - return err + + var hash []byte + var err error = nil + + if hashed { + hash = []byte(password) + } else { + hash, err = bcrypt.GenerateFromPassword([]byte(password), a.bcryptCost) + if err != nil { + return err + } } + userID := util.RandomStringPrefix(userIDPrefix, userIDLength) syncTopic, now := util.RandomStringPrefix(syncTopicPrefix, syncTopicLength), time.Now().Unix() if _, err = a.db.Exec(insertUserQuery, userID, username, hash, role, syncTopic, now); err != nil { @@ -1192,10 +1201,17 @@ func (a *Manager) ReservationOwner(topic string) (string, error) { } // ChangePassword changes a user's password -func (a *Manager) ChangePassword(username, password string) error { - hash, err := bcrypt.GenerateFromPassword([]byte(password), a.bcryptCost) - if err != nil { - return err +func (a *Manager) ChangePassword(username, password string, hashed bool) error { + var hash []byte + var err error + + if hashed { + hash = []byte(password) + } else { + hash, err = bcrypt.GenerateFromPassword([]byte(password), a.bcryptCost) + if err != nil { + return err + } } if _, err := a.db.Exec(updateUserPassQuery, hash, username); err != nil { return err diff --git a/user/manager_test.go b/user/manager_test.go index e9a95b0f..c81b8cab 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -18,9 +18,9 @@ const minBcryptTimingMillis = int64(50) // Ideally should be >100ms, but this sh func TestManager_FullScenario_Default_DenyAll(t *testing.T) { a := newTestManagerFromFile(t, filepath.Join(t.TempDir(), "user.db"), "", PermissionDenyAll, DefaultUserPasswordBcryptCost, DefaultUserStatsQueueWriterInterval) - require.Nil(t, a.AddUser("phil", "phil", RoleAdmin)) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) - require.Nil(t, a.AddUser("john", "john", RoleUser)) + require.Nil(t, a.AddUser("phil", "phil", RoleAdmin, false)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) + require.Nil(t, a.AddUser("john", "john", RoleUser, false)) require.Nil(t, a.AllowAccess("ben", "mytopic", PermissionReadWrite)) require.Nil(t, a.AllowAccess("ben", "readme", PermissionRead)) require.Nil(t, a.AllowAccess("ben", "writeme", PermissionWrite)) @@ -134,7 +134,7 @@ func TestManager_Access_Order_LengthWriteRead(t *testing.T) { // and longer ACL rules are prioritized as well. a := newTestManagerFromFile(t, filepath.Join(t.TempDir(), "user.db"), "", PermissionDenyAll, DefaultUserPasswordBcryptCost, DefaultUserStatsQueueWriterInterval) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) require.Nil(t, a.AllowAccess("ben", "test*", PermissionReadWrite)) require.Nil(t, a.AllowAccess("ben", "*", PermissionRead)) @@ -147,20 +147,20 @@ func TestManager_Access_Order_LengthWriteRead(t *testing.T) { func TestManager_AddUser_Invalid(t *testing.T) { a := newTestManager(t, PermissionDenyAll) - require.Equal(t, ErrInvalidArgument, a.AddUser(" invalid ", "pass", RoleAdmin)) - require.Equal(t, ErrInvalidArgument, a.AddUser("validuser", "pass", "invalid-role")) + require.Equal(t, ErrInvalidArgument, a.AddUser(" invalid ", "pass", RoleAdmin, false)) + require.Equal(t, ErrInvalidArgument, a.AddUser("validuser", "pass", "invalid-role", false)) } func TestManager_AddUser_Timing(t *testing.T) { a := newTestManagerFromFile(t, filepath.Join(t.TempDir(), "user.db"), "", PermissionDenyAll, DefaultUserPasswordBcryptCost, DefaultUserStatsQueueWriterInterval) start := time.Now().UnixMilli() - require.Nil(t, a.AddUser("user", "pass", RoleAdmin)) + require.Nil(t, a.AddUser("user", "pass", RoleAdmin, false)) require.GreaterOrEqual(t, time.Now().UnixMilli()-start, minBcryptTimingMillis) } func TestManager_AddUser_And_Query(t *testing.T) { a := newTestManagerFromFile(t, filepath.Join(t.TempDir(), "user.db"), "", PermissionDenyAll, DefaultUserPasswordBcryptCost, DefaultUserStatsQueueWriterInterval) - require.Nil(t, a.AddUser("user", "pass", RoleAdmin)) + require.Nil(t, a.AddUser("user", "pass", RoleAdmin, false)) require.Nil(t, a.ChangeBilling("user", &Billing{ StripeCustomerID: "acct_123", StripeSubscriptionID: "sub_123", @@ -187,7 +187,7 @@ func TestManager_MarkUserRemoved_RemoveDeletedUsers(t *testing.T) { a := newTestManager(t, PermissionDenyAll) // Create user, add reservations and token - require.Nil(t, a.AddUser("user", "pass", RoleAdmin)) + require.Nil(t, a.AddUser("user", "pass", RoleAdmin, false)) require.Nil(t, a.AddReservation("user", "mytopic", PermissionRead)) u, err := a.User("user") @@ -237,7 +237,7 @@ func TestManager_CreateToken_Only_Lower(t *testing.T) { a := newTestManager(t, PermissionDenyAll) // Create user, add reservations and token - require.Nil(t, a.AddUser("user", "pass", RoleAdmin)) + require.Nil(t, a.AddUser("user", "pass", RoleAdmin, false)) u, err := a.User("user") require.Nil(t, err) @@ -248,8 +248,8 @@ func TestManager_CreateToken_Only_Lower(t *testing.T) { func TestManager_UserManagement(t *testing.T) { a := newTestManager(t, PermissionDenyAll) - require.Nil(t, a.AddUser("phil", "phil", RoleAdmin)) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("phil", "phil", RoleAdmin, false)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) require.Nil(t, a.AllowAccess("ben", "mytopic", PermissionReadWrite)) require.Nil(t, a.AllowAccess("ben", "readme", PermissionRead)) require.Nil(t, a.AllowAccess("ben", "writeme", PermissionWrite)) @@ -339,21 +339,31 @@ func TestManager_UserManagement(t *testing.T) { func TestManager_ChangePassword(t *testing.T) { a := newTestManager(t, PermissionDenyAll) - require.Nil(t, a.AddUser("phil", "phil", RoleAdmin)) + require.Nil(t, a.AddUser("phil", "phil", RoleAdmin, false)) + require.Nil(t, a.AddUser("jane", "$2b$10$OyqU72muEy7VMd1SAU2Iru5IbeSMgrtCGHu/fWLmxL1MwlijQXWbG", RoleUser, true)) _, err := a.Authenticate("phil", "phil") require.Nil(t, err) - require.Nil(t, a.ChangePassword("phil", "newpass")) + _, err = a.Authenticate("jane", "jane") + require.Nil(t, err) + + require.Nil(t, a.ChangePassword("phil", "newpass", false)) _, err = a.Authenticate("phil", "phil") require.Equal(t, ErrUnauthenticated, err) _, err = a.Authenticate("phil", "newpass") require.Nil(t, err) + + require.Nil(t, a.ChangePassword("jane", "$2b$10$CNaCW.q1R431urlbQ5Drh.zl48TiiOeJSmZgfcswkZiPbJGQ1ApSS", true)) + _, err = a.Authenticate("jane", "jane") + require.Equal(t, ErrUnauthenticated, err) + _, err = a.Authenticate("jane", "newpass") + require.Nil(t, err) } func TestManager_ChangeRole(t *testing.T) { a := newTestManager(t, PermissionDenyAll) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) require.Nil(t, a.AllowAccess("ben", "mytopic", PermissionReadWrite)) require.Nil(t, a.AllowAccess("ben", "readme", PermissionRead)) @@ -378,8 +388,8 @@ func TestManager_ChangeRole(t *testing.T) { func TestManager_Reservations(t *testing.T) { a := newTestManager(t, PermissionDenyAll) - require.Nil(t, a.AddUser("phil", "phil", RoleUser)) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("phil", "phil", RoleUser, false)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) require.Nil(t, a.AddReservation("ben", "ztopic_", PermissionDenyAll)) require.Nil(t, a.AddReservation("ben", "readme", PermissionRead)) require.Nil(t, a.AllowAccess("ben", "something-else", PermissionRead)) @@ -460,7 +470,7 @@ func TestManager_ChangeRoleFromTierUserToAdmin(t *testing.T) { AttachmentTotalSizeLimit: 524288000, AttachmentExpiryDuration: 24 * time.Hour, })) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) require.Nil(t, a.ChangeTier("ben", "pro")) require.Nil(t, a.AddReservation("ben", "mytopic", PermissionDenyAll)) @@ -507,7 +517,7 @@ func TestManager_ChangeRoleFromTierUserToAdmin(t *testing.T) { func TestManager_Token_Valid(t *testing.T) { a := newTestManager(t, PermissionDenyAll) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) u, err := a.User("ben") require.Nil(t, err) @@ -551,7 +561,7 @@ func TestManager_Token_Valid(t *testing.T) { func TestManager_Token_Invalid(t *testing.T) { a := newTestManager(t, PermissionDenyAll) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) u, err := a.AuthenticateToken(strings.Repeat("x", 32)) // 32 == token length require.Nil(t, u) @@ -570,7 +580,7 @@ func TestManager_Token_NotFound(t *testing.T) { func TestManager_Token_Expire(t *testing.T) { a := newTestManager(t, PermissionDenyAll) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) u, err := a.User("ben") require.Nil(t, err) @@ -618,7 +628,7 @@ func TestManager_Token_Expire(t *testing.T) { func TestManager_Token_Extend(t *testing.T) { a := newTestManager(t, PermissionDenyAll) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) // Try to extend token for user without token u, err := a.User("ben") @@ -647,8 +657,8 @@ func TestManager_Token_MaxCount_AutoDelete(t *testing.T) { // Tests that tokens are automatically deleted when the maximum number of tokens is reached a := newTestManager(t, PermissionDenyAll) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) - require.Nil(t, a.AddUser("phil", "phil", RoleUser)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) + require.Nil(t, a.AddUser("phil", "phil", RoleUser, false)) ben, err := a.User("ben") require.Nil(t, err) @@ -723,7 +733,7 @@ func TestManager_Token_MaxCount_AutoDelete(t *testing.T) { func TestManager_EnqueueStats_ResetStats(t *testing.T) { a, err := NewManager(filepath.Join(t.TempDir(), "db"), "", PermissionReadWrite, bcrypt.MinCost, 1500*time.Millisecond) require.Nil(t, err) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) // Baseline: No messages or emails u, err := a.User("ben") @@ -765,7 +775,7 @@ func TestManager_EnqueueStats_ResetStats(t *testing.T) { func TestManager_EnqueueTokenUpdate(t *testing.T) { a, err := NewManager(filepath.Join(t.TempDir(), "db"), "", PermissionReadWrite, bcrypt.MinCost, 500*time.Millisecond) require.Nil(t, err) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) // Create user and token u, err := a.User("ben") @@ -798,7 +808,7 @@ func TestManager_EnqueueTokenUpdate(t *testing.T) { func TestManager_ChangeSettings(t *testing.T) { a, err := NewManager(filepath.Join(t.TempDir(), "db"), "", PermissionReadWrite, bcrypt.MinCost, 1500*time.Millisecond) require.Nil(t, err) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) // No settings u, err := a.User("ben") @@ -866,7 +876,7 @@ func TestManager_Tier_Create_Update_List_Delete(t *testing.T) { AttachmentBandwidthLimit: 21474836480, StripeMonthlyPriceID: "price_2", })) - require.Nil(t, a.AddUser("phil", "phil", RoleUser)) + require.Nil(t, a.AddUser("phil", "phil", RoleUser, false)) require.Nil(t, a.ChangeTier("phil", "pro")) ti, err := a.Tier("pro") @@ -981,7 +991,7 @@ func TestManager_Tier_Change_And_Reset(t *testing.T) { Name: "Pro", ReservationLimit: 4, })) - require.Nil(t, a.AddUser("phil", "phil", RoleUser)) + require.Nil(t, a.AddUser("phil", "phil", RoleUser, false)) require.Nil(t, a.ChangeTier("phil", "pro")) // Add 10 reservations (pro tier allows that) @@ -1007,7 +1017,7 @@ func TestManager_Tier_Change_And_Reset(t *testing.T) { func TestUser_PhoneNumberAddListRemove(t *testing.T) { a := newTestManager(t, PermissionDenyAll) - require.Nil(t, a.AddUser("phil", "phil", RoleUser)) + require.Nil(t, a.AddUser("phil", "phil", RoleUser, false)) phil, err := a.User("phil") require.Nil(t, err) require.Nil(t, a.AddPhoneNumber(phil.ID, "+1234567890")) @@ -1032,8 +1042,8 @@ func TestUser_PhoneNumberAddListRemove(t *testing.T) { func TestUser_PhoneNumberAdd_Multiple_Users_Same_Number(t *testing.T) { a := newTestManager(t, PermissionDenyAll) - require.Nil(t, a.AddUser("phil", "phil", RoleUser)) - require.Nil(t, a.AddUser("ben", "ben", RoleUser)) + require.Nil(t, a.AddUser("phil", "phil", RoleUser, false)) + require.Nil(t, a.AddUser("ben", "ben", RoleUser, false)) phil, err := a.User("phil") require.Nil(t, err) ben, err := a.User("ben") From d1ac8d03e0a0971c1857bc525e381ace704ff4ee Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 21 May 2025 18:49:19 -0400 Subject: [PATCH 036/117] Security updates --- cmd/serve.go | 4 +- go.mod | 116 +- go.sum | 539 ++---- log/log.go | 2 +- main.go | 2 +- server/server.go | 2 +- web/package-lock.json | 4050 ++++++++++++++++++++++------------------- 7 files changed, 2449 insertions(+), 2266 deletions(-) diff --git a/cmd/serve.go b/cmd/serve.go index 62e0a14a..f0ea9f5a 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -424,9 +424,9 @@ func execServe(c *cli.Context) error { // Run server s, err := server.New(conf) if err != nil { - log.Fatal(err.Error()) + log.Fatal("%s", err.Error()) } else if err := s.Run(); err != nil { - log.Fatal(err.Error()) + log.Fatal("%s", err.Error()) } log.Info("Exiting.") return nil diff --git a/go.mod b/go.mod index 3806043b..05315a6c 100644 --- a/go.mod +++ b/go.mod @@ -1,27 +1,27 @@ module heckel.io/ntfy/v2 -go 1.22 +go 1.24 -toolchain go1.22.1 +toolchain go1.24.0 require ( - cloud.google.com/go/firestore v1.17.0 // indirect - cloud.google.com/go/storage v1.43.0 // indirect - github.com/BurntSushi/toml v1.4.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect + cloud.google.com/go/firestore v1.18.0 // indirect + cloud.google.com/go/storage v1.54.0 // indirect + github.com/BurntSushi/toml v1.5.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/emersion/go-smtp v0.18.0 - github.com/gabriel-vasile/mimetype v1.4.5 + github.com/gabriel-vasile/mimetype v1.4.9 github.com/gorilla/websocket v1.5.3 - github.com/mattn/go-sqlite3 v1.14.23 - github.com/olebedev/when v1.0.0 - github.com/stretchr/testify v1.9.0 - github.com/urfave/cli/v2 v2.27.4 - golang.org/x/crypto v0.27.0 - golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sync v0.8.0 - golang.org/x/term v0.24.0 - golang.org/x/time v0.6.0 - google.golang.org/api v0.199.0 + github.com/mattn/go-sqlite3 v1.14.28 + github.com/olebedev/when v1.1.0 + github.com/stretchr/testify v1.10.0 + github.com/urfave/cli/v2 v2.27.6 + golang.org/x/crypto v0.38.0 + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sync v0.14.0 + golang.org/x/term v0.32.0 + golang.org/x/time v0.11.0 + google.golang.org/api v0.234.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -30,63 +30,75 @@ replace github.com/emersion/go-smtp => github.com/emersion/go-smtp v0.17.0 // Pi require github.com/pkg/errors v0.9.1 // indirect require ( - firebase.google.com/go/v4 v4.14.1 - github.com/SherClockHolmes/webpush-go v1.3.0 + firebase.google.com/go/v4 v4.15.2 + github.com/SherClockHolmes/webpush-go v1.4.0 github.com/microcosm-cc/bluemonday v1.0.27 - github.com/prometheus/client_golang v1.20.4 + github.com/prometheus/client_golang v1.22.0 github.com/stripe/stripe-go/v74 v74.30.0 ) require ( - cloud.google.com/go v0.115.1 // indirect - cloud.google.com/go/auth v0.9.5 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect - cloud.google.com/go/compute/metadata v0.5.2 // indirect - cloud.google.com/go/iam v1.2.1 // indirect - cloud.google.com/go/longrunning v0.6.1 // indirect + cel.dev/expr v0.24.0 // indirect + cloud.google.com/go v0.121.2 // indirect + cloud.google.com/go/auth v0.16.1 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect + cloud.google.com/go/longrunning v0.6.7 // indirect + cloud.google.com/go/monitoring v1.24.2 // indirect github.com/AlekSi/pointer v1.2.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect github.com/MicahParks/keyfunc v1.9.0 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect + github.com/emersion/go-sasl v0.0.0-20241020182733-b788ff22d5a6 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect + github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-jose/go-jose/v4 v4.1.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang-jwt/jwt/v4 v4.5.2 // indirect + github.com/golang-jwt/jwt/v5 v5.2.2 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/s2a-go v0.1.8 // indirect + github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.13.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect + github.com/googleapis/gax-go/v2 v2.14.2 // indirect github.com/gorilla/css v1.0.1 // indirect - github.com/klauspost/compress v1.17.10 // indirect - github.com/kr/text v0.2.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.59.1 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.64.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect - go.opentelemetry.io/otel v1.30.0 // indirect - go.opentelemetry.io/otel/metric v1.30.0 // indirect - go.opentelemetry.io/otel/trace v1.30.0 // indirect - golang.org/x/net v0.29.0 // indirect - golang.org/x/sys v0.25.0 // indirect - golang.org/x/text v0.18.0 // indirect + github.com/zeebo/errs v1.4.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect + go.opentelemetry.io/otel v1.36.0 // indirect + go.opentelemetry.io/otel/metric v1.36.0 // indirect + go.opentelemetry.io/otel/sdk v1.36.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect + go.opentelemetry.io/otel/trace v1.36.0 // indirect + golang.org/x/net v0.40.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.25.0 // indirect google.golang.org/appengine/v2 v2.0.6 // indirect - google.golang.org/genproto v0.0.0-20240924160255-9d4c2d233b61 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240924160255-9d4c2d233b61 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240924160255-9d4c2d233b61 // indirect - google.golang.org/grpc v1.67.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect + google.golang.org/genproto v0.0.0-20250519155744-55703ea1f237 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect + google.golang.org/grpc v1.72.1 // indirect + google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 0dd057b5..6a26dec4 100644 --- a/go.sum +++ b/go.sum @@ -1,345 +1,216 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw= -cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= -cloud.google.com/go v0.113.0 h1:g3C70mn3lWfckKBiCVsAshabrDg01pQ0pnX1MNtnMkA= -cloud.google.com/go v0.113.0/go.mod h1:glEqlogERKYeePz6ZdkcLJ28Q2I6aERgDDErBg9GzO8= -cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= -cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= -cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= -cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= -cloud.google.com/go/auth v0.3.0 h1:PRyzEpGfx/Z9e8+lHsbkoUVXD0gnu4MNmm7Gp8TQNIs= -cloud.google.com/go/auth v0.3.0/go.mod h1:lBv6NKTWp8E3LPzmO1TbiiRKc4drLOfHsgmlH9ogv5w= -cloud.google.com/go/auth v0.4.0 h1:vcJWEguhY8KuiHoSs/udg1JtIRYm3YAWPBE1moF1m3U= -cloud.google.com/go/auth v0.4.0/go.mod h1:tO/chJN3obc5AbRYFQDsuFbL4wW5y8LfbPtDCfgwOVE= -cloud.google.com/go/auth v0.4.1 h1:Z7YNIhlWRtrnKlZke7z3GMqzvuYzdc2z98F9D1NV5Hg= -cloud.google.com/go/auth v0.4.1/go.mod h1:QVBuVEKpCn4Zp58hzRGvL0tjRGU0YqdRTdCHM1IHnro= -cloud.google.com/go/auth v0.7.1 h1:Iv1bbpzJ2OIg16m94XI9/tlzZZl3cdeR3nGVGj78N7s= -cloud.google.com/go/auth v0.7.1/go.mod h1:VEc4p5NNxycWQTMQEDQF0bd6aTMb6VgYDXEwiJJQAbs= -cloud.google.com/go/auth v0.9.5 h1:4CTn43Eynw40aFVr3GpPqsQponx2jv0BQpjvajsbbzw= -cloud.google.com/go/auth v0.9.5/go.mod h1:Xo0n7n66eHyOWWCnitop6870Ilwo3PiZyodVkkH1xWM= -cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= -cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= -cloud.google.com/go/auth/oauth2adapt v0.2.3 h1:MlxF+Pd3OmSudg/b1yZ5lJwoXCEaeedAguodky1PcKI= -cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX5cuhwU+ffUuXRJE8I= -cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= -cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= -cloud.google.com/go/compute v1.26.0 h1:uHf0NN2nvxl1Gh4QO83yRCOdMK4zivtMS5gv0dEX0hg= -cloud.google.com/go/compute v1.26.0/go.mod h1:T9RIRap4pVHCGUkVFRJ9hygT3KCXjip41X1GgWtBBII= -cloud.google.com/go/compute v1.27.2 h1:5cE5hdrwJV/92ravlwIFRGnyH9CpLGhh4N0ZDVTU+BA= -cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi8o= -cloud.google.com/go/compute v1.28.1/go.mod h1:b72iXMY4FucVry3NR3Li4kVyyTvbMDE7x5WsqvxjsYk= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= -cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= -cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= -cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= -cloud.google.com/go/firestore v1.15.0 h1:/k8ppuWOtNuDHt2tsRV42yI21uaGnKDEQnRFeBpbFF8= -cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= -cloud.google.com/go/firestore v1.17.0 h1:iEd1LBbkDZTFsLw3sTH50eyg4qe8eoG6CjocmEXO9aQ= -cloud.google.com/go/firestore v1.17.0/go.mod h1:69uPx1papBsY8ZETooc71fOhoKkD70Q1DwMrtKuOT/Y= -cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM= -cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= -cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= -cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= -cloud.google.com/go/iam v1.1.11 h1:0mQ8UKSfdHLut6pH9FM3bI55KWR46ketn0PuXleDyxw= -cloud.google.com/go/iam v1.1.11/go.mod h1:biXoiLWYIKntto2joP+62sd9uW5EpkZmKIvfNcTWlnQ= -cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU= -cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g= -cloud.google.com/go/longrunning v0.5.6 h1:xAe8+0YaWoCKr9t1+aWe+OeQgN/iJK1fEgZSXmjuEaE= -cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= -cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU= -cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng= -cloud.google.com/go/longrunning v0.5.10 h1:eB/BniENNRKhjz/xgiillrdcH3G74TGSl3BXinGlI7E= -cloud.google.com/go/longrunning v0.5.10/go.mod h1:tljz5guTr5oc/qhlUjBlk7UAIFMOGuPNxkNDZXlLics= -cloud.google.com/go/longrunning v0.6.1 h1:lOLTFxYpr8hcRtcwWir5ITh1PAKUD/sG2lKrTSYjyMc= -cloud.google.com/go/longrunning v0.6.1/go.mod h1:nHISoOZpBcmlwbJmiVk5oDRz0qG/ZxPynEGs1iZ79s0= -cloud.google.com/go/storage v1.40.0 h1:VEpDQV5CJxFmJ6ueWNsKxcr1QAYOXEgxDa+sBbJahPw= -cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g= -cloud.google.com/go/storage v1.41.0 h1:RusiwatSu6lHeEXe3kglxakAmAbfV+rhtPqA6i8RBx0= -cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCepp5vR6Sq80= -cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= -cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= -firebase.google.com/go/v4 v4.14.0 h1:Tc9jWzMUApUFUA5UUx/HcBeZ+LPjlhG2vNRfWJrcMwU= -firebase.google.com/go/v4 v4.14.0/go.mod h1:pLATyL6xH2o9AMe7rqHdmmOUE/Ph7wcwepIs+uiEKPg= -firebase.google.com/go/v4 v4.14.1 h1:4qiUETaFRWoFGE1XP5VbcEdtPX93Qs+8B/7KvP2825g= -firebase.google.com/go/v4 v4.14.1/go.mod h1:fgk2XshgNDEKaioKco+AouiegSI9oTWVqRaBdTTGBoM= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cloud.google.com/go v0.121.2 h1:v2qQpN6Dx9x2NmwrqlesOt3Ys4ol5/lFZ6Mg1B7OJCg= +cloud.google.com/go v0.121.2/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw= +cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= +cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/firestore v1.18.0 h1:cuydCaLS7Vl2SatAeivXyhbhDEIR8BDmtn4egDhIn2s= +cloud.google.com/go/firestore v1.18.0/go.mod h1:5ye0v48PhseZBdcl0qbl3uttu7FIEwEYVaWm0UIEOEU= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= +cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= +cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= +cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= +cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= +cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= +cloud.google.com/go/storage v1.54.0 h1:Du3XEyliAiftfyW0bwfdppm2MMLdpVAfiIg4T2nAI+0= +cloud.google.com/go/storage v1.54.0/go.mod h1:hIi9Boe8cHxTyaeqh7KMMwKg088VblFK46C2x/BWaZE= +cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= +firebase.google.com/go/v4 v4.15.2 h1:KJtV4rAfO2CVCp40hBfVk+mqUqg7+jQKx7yOgFDnXBg= +firebase.google.com/go/v4 v4.15.2/go.mod h1:qkD/HtSumrPMTLs0ahQrje5gTw2WKFKrzVFoqy4SbKA= github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= -github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= -github.com/SherClockHolmes/webpush-go v1.3.0 h1:CAu3FvEE9QS4drc3iKNgpBWFfGqNthKlZhp5QpYnu6k= -github.com/SherClockHolmes/webpush-go v1.3.0/go.mod h1:AxRHmJuYwKGG1PVgYzToik1lphQvDnqFYDqimHvwhIw= +github.com/SherClockHolmes/webpush-go v1.4.0 h1:ocnzNKWN23T9nvHi6IfyrQjkIc0oJWv1B1pULsf9i3s= +github.com/SherClockHolmes/webpush-go v1.4.0/go.mod h1:XSq8pKX11vNV8MJEMwjrlTkxhAj1zKfxmyhdV7Pd6UA= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= -github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= -github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 h1:hH4PQfOndHDlpzYfLAAfl63E8Le6F2+EL/cdhlkyRJY= -github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= +github.com/emersion/go-sasl v0.0.0-20241020182733-b788ff22d5a6 h1:oP4q0fw+fOSWn3DfFi4EXdT+B+gTtzx8GC9xsc26Znk= +github.com/emersion/go-sasl v0.0.0-20241020182733-b788ff22d5a6/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ= github.com/emersion/go-smtp v0.17.0 h1:tq90evlrcyqRfE6DSXaWVH54oX6OuZOQECEmhWBMEtI= github.com/emersion/go-smtp v0.17.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= +github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= +github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= +github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= -github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= -github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= -github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= +github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY= +github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok= +github.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY= +github.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= +github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= -github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= -github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= -github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= -github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= -github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= -github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= -github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= -github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= +github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= +github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0= -github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= -github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= -github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= +github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/olebedev/when v1.0.0 h1:T2DZCj8HxUhOVxcqaLOmzuTr+iZLtMHsZEim7mjIA2w= -github.com/olebedev/when v1.0.0/go.mod h1:T0THb4kP9D3NNqlvCwIG4GyUioTAzEhB4RNVzig/43E= +github.com/olebedev/when v1.1.0 h1:dlpoRa7huImhNtEx4yl0WYfTHVEWmJmIWd7fEkTHayc= +github.com/olebedev/when v1.1.0/go.mod h1:T0THb4kP9D3NNqlvCwIG4GyUioTAzEhB4RNVzig/43E= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= -github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= -github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= -github.com/prometheus/common v0.59.1 h1:LXb1quJHWm1P6wq/U824uxYi4Sg0oGvNeUm1z5dJoX0= -github.com/prometheus/common v0.59.1/go.mod h1:GpWM7dewqmVYcd7SmRaiWVe9SSqjf0UrwnYnpEZNuT0= -github.com/prometheus/procfs v0.14.0 h1:Lw4VdGGoKEZilJsayHf0B+9YgLGREba2C6xr+Fdfq6s= -github.com/prometheus/procfs v0.14.0/go.mod h1:XL+Iwz8k8ZabyZfMFHPiilCniixqQarAy5Mu67pHlNQ= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4= +github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= +github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stripe/stripe-go/v74 v74.30.0 h1:0Kf0KkeFnY7iRhOwvTerX0Ia1BRw+eV1CVJ51mGYAUY= github.com/stripe/stripe-go/v74 v74.30.0/go.mod h1:f9L6LvaXa35ja7eyvP6GQswoaIPaBRvGAimAO+udbBw= -github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho= -github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= -github.com/urfave/cli/v2 v2.27.2 h1:6e0H+AkS+zDckwPCUrZkKX38mRaau4nL2uipkJpbkcI= -github.com/urfave/cli/v2 v2.27.2/go.mod h1:g0+79LmHHATl7DAcHO99smiR/T7uGLw84w8Y42x+4eM= -github.com/urfave/cli/v2 v2.27.4 h1:o1owoI+02Eb+K107p27wEX9Bb8eqIoZCfLXloLUSWJ8= -github.com/urfave/cli/v2 v2.27.4/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ= -github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= -github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk= +github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g= +github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0 h1:A3SayB3rNyt+1S6qpI9mHPkeHTZbD7XILEqWnYZb2l0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.51.0/go.mod h1:27iA5uvhuRNmalO+iEUdVn5ZMj2qy10Mm+XRIpRmyuU= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0 h1:Xs2Ncz0gNihqu9iosIZ5SkBbWo5T8JhhLJFMQL1qmLI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0/go.mod h1:vy+2G/6NvVMpwGX/NyLqcC41fxepnuKHk16E6IZUcJc= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= -go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= -go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= -go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= -go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= -go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= -go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= +github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0 h1:PB3Zrjs1sG1GBX51SXyTSoOTqcDglmsk7nT6tkKPb/k= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0/go.mod h1:U2R3XyVPzn0WX7wOIypPuptulsMcPDPs/oiSVOMVnHY= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= +go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -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.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= -golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= -golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= -golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= -golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -347,26 +218,23 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= 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/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= -golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= -golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -374,107 +242,38 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= +golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.176.1 h1:DJSXnV6An+NhJ1J+GWtoF2nHEuqB1VNoTfnIbjNvwD4= -google.golang.org/api v0.176.1/go.mod h1:j2MaSDYcvYV1lkZ1+SMW4IeF90SrEyFA+tluDYWRrFg= -google.golang.org/api v0.178.0 h1:yoW/QMI4bRVCHF+NWOTa4cL8MoWL3Jnuc7FlcFF91Ok= -google.golang.org/api v0.178.0/go.mod h1:84/k2v8DFpDRebpGcooklv/lais3MEfqpaBLA12gl2U= -google.golang.org/api v0.180.0 h1:M2D87Yo0rGBPWpo1orwfCLehUUL6E7/TYe5gvMQWDh4= -google.golang.org/api v0.180.0/go.mod h1:51AiyoEg1MJPSZ9zvklA8VnRILPXxn1iVen9v25XHAE= -google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw= -google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag= -google.golang.org/api v0.199.0 h1:aWUXClp+VFJmqE0JPvpZOK3LDQMyFKYIow4etYd9qxs= -google.golang.org/api v0.199.0/go.mod h1:ohG4qSztDJmZdjK/Ar6MhbAmb/Rpi4JHOqagsh90K28= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/api v0.234.0 h1:d3sAmYq3E9gdr2mpmiWGbm9pHsA/KJmyiLkwKfHBqU4= +google.golang.org/api v0.234.0/go.mod h1:QpeJkemzkFKe5VCE/PMv7GsUfn9ZF+u+q1Q7w6ckxTg= google.golang.org/appengine/v2 v2.0.6 h1:LvPZLGuchSBslPBp+LAhihBeGSiRh1myRoYK4NtuBIw= google.golang.org/appengine/v2 v2.0.6/go.mod h1:WoEXGoXNfa0mLvaH5sV3ZSGXwVmy8yf7Z1JKf3J3wLI= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240415180920-8c6c420018be h1:g4aX8SUFA8V5F4LrSY5EclyGYw1OZN4HS1jTyjB9ZDc= -google.golang.org/genproto v0.0.0-20240415180920-8c6c420018be/go.mod h1:FeSdT5fk+lkxatqJP38MsUicGqHax5cLtmy/6TAuxO4= -google.golang.org/genproto v0.0.0-20240506185236-b8a5c65736ae h1:HjgkYCl6cWQEKSHkpUp4Q8VB74swzyBwTz1wtTzahm0= -google.golang.org/genproto v0.0.0-20240506185236-b8a5c65736ae/go.mod h1:i4np6Wrjp8EujFAUn0CM0SH+iZhY1EbrfzEIJbFkHFM= -google.golang.org/genproto v0.0.0-20240513163218-0867130af1f8 h1:XpH03M6PDRKTo1oGfZBXu2SzwcbfxUokgobVinuUZoU= -google.golang.org/genproto v0.0.0-20240513163218-0867130af1f8/go.mod h1:OLh2Ylz+WlYAJaSBRpJIJLP8iQP+8da+fpxbwNEAV/o= -google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d h1:/hmn0Ku5kWij/kjGsrcJeC1T/MrJi2iNWwgAqrihFwc= -google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY= -google.golang.org/genproto v0.0.0-20240924160255-9d4c2d233b61 h1:KipVMxePgXPFBzXOvpKbny3RVdVmJOD64R/Ob7GPWEs= -google.golang.org/genproto v0.0.0-20240924160255-9d4c2d233b61/go.mod h1:HiAZQz/G7n0EywFjmncAwsfnmFm2bjm7qPjwl8hyzjM= -google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be h1:Zz7rLWqp0ApfsR/l7+zSHhY3PMiH2xqgxlfYfAfNpoU= -google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be/go.mod h1:dvdCTIoAGbkWbcIKBniID56/7XHTt6WfxXNMxuziJ+w= -google.golang.org/genproto/googleapis/api v0.0.0-20240506185236-b8a5c65736ae h1:AH34z6WAGVNkllnKs5raNq3yRq93VnjBG6rpfub/jYk= -google.golang.org/genproto/googleapis/api v0.0.0-20240506185236-b8a5c65736ae/go.mod h1:FfiGhwUm6CJviekPrc0oJ+7h29e+DmWU6UtjX0ZvI7Y= -google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8 h1:W5Xj/70xIA4x60O/IFyXivR5MGqblAb8R3w26pnD6No= -google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8/go.mod h1:vPrPUTsDCYxXWjP7clS81mZ6/803D8K4iM9Ma27VKas= -google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d h1:kHjw/5UfflP/L5EbledDrcG4C2597RtymmGRZvHiCuY= -google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0= -google.golang.org/genproto/googleapis/api v0.0.0-20240924160255-9d4c2d233b61 h1:pAjq8XSSzXoP9ya73v/w+9QEAAJNluLrpmMq5qFJQNY= -google.golang.org/genproto/googleapis/api v0.0.0-20240924160255-9d4c2d233b61/go.mod h1:O6rP0uBq4k0mdi/b4ZEMAZjkhYWhS815kCvaMha4VN8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be h1:LG9vZxsWGOmUKieR8wPAUR3u3MpnYFQZROPIMaXh7/A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240506185236-b8a5c65736ae h1:c55+MER4zkBS14uJhSZMGGmya0yJx5iHV4x/fpOSNRk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240506185236-b8a5c65736ae/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 h1:mxSlqyb8ZAHsYDCfiXN1EDdNTdvjUJSLY+OnAUtYNYA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d h1:JU0iKnSg02Gmb5ZdV8nYsKEKsP6o/FGVWTrw4i1DA9A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240924160255-9d4c2d233b61 h1:N9BgCIAUvn/M+p4NJccWPWb3BWh88+zyL0ll9HgbEeM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240924160255-9d4c2d233b61/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= -google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw= -google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/genproto v0.0.0-20250519155744-55703ea1f237 h1:2zGWyk04EwQ3mmV4dd4M4U7P/igHi5p7CBJEg1rI6A8= +google.golang.org/genproto v0.0.0-20250519155744-55703ea1f237/go.mod h1:LhI4bRmX3rqllzQ+BGneexULkEjBf2gsAfkbeCA8IbU= +google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 h1:Kog3KlB4xevJlAcbbbzPfRG0+X9fdoGM+UBRKVz6Wr0= +google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= +google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -483,5 +282,3 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/log/log.go b/log/log.go index 20ad6151..98d9652f 100644 --- a/log/log.go +++ b/log/log.go @@ -198,7 +198,7 @@ func (w *peekLogWriter) Write(p []byte) (n int, err error) { if len(p) == 0 || p[0] == '{' || CurrentFormat() == TextFormat { return w.w.Write(p) } - m := newEvent().Tag(tagStdLog).Render(InfoLevel, strings.TrimSpace(string(p))) + m := newEvent().Tag(tagStdLog).Render(InfoLevel, "%s", strings.TrimSpace(string(p))) if m == "" { return 0, nil } diff --git a/main.go b/main.go index d4600dc8..d23072d5 100644 --- a/main.go +++ b/main.go @@ -23,7 +23,7 @@ If you want to chat, simply join the Discord server (https://discord.gg/cT7ECsZj the Matrix room (https://matrix.to/#/#ntfy:matrix.org). ntfy %s (%s), runtime %s, built at %s -Copyright (C) 2022 Philipp C. Heckel, licensed under Apache License 2.0 & GPLv2 +Copyright (C) Philipp C. Heckel, licensed under Apache License 2.0 & GPLv2 `, version, commit[:7], runtime.Version(), date) app := cmd.New() diff --git a/server/server.go b/server/server.go index ee2da76a..7e542d85 100644 --- a/server/server.go +++ b/server/server.go @@ -1016,7 +1016,7 @@ func (s *Server) parsePublishParams(r *http.Request, m *message) (cache bool, fi if actionsStr != "" { m.Actions, e = parseActions(actionsStr) if e != nil { - return false, false, "", "", false, false, errHTTPBadRequestActionsInvalid.Wrap(e.Error()) + return false, false, "", "", false, false, errHTTPBadRequestActionsInvalid.Wrap("%s", e.Error()) } } contentType, markdown := readParam(r, "content-type", "content_type"), readBoolParam(r, false, "x-markdown", "markdown", "md") diff --git a/web/package-lock.json b/web/package-lock.json index e2f51f61..813da25a 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -50,6 +50,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -59,42 +60,46 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", + "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -113,56 +118,48 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6", + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -171,17 +168,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", - "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.4", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "engines": { @@ -192,13 +190,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "engines": { @@ -209,10 +208,11 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -225,40 +225,42 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -268,35 +270,38 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -306,14 +311,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -322,104 +328,84 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.27.1" }, "bin": { "parser": "bin/babel-parser.js" @@ -429,13 +415,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", - "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -445,12 +432,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", - "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -460,12 +448,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", - "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -475,14 +464,15 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -492,13 +482,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", - "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -512,6 +503,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -519,76 +511,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", - "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -598,138 +528,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", - "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -743,6 +548,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -755,12 +561,13 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -770,15 +577,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", - "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.4" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -788,14 +595,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -805,12 +613,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -820,12 +629,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", + "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -835,13 +645,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", - "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -851,14 +662,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -868,16 +679,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", - "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.4", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", "globals": "^11.1.0" }, "engines": { @@ -888,13 +700,14 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -904,12 +717,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", + "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -919,13 +733,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -935,12 +750,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -950,13 +766,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", - "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -966,13 +783,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -982,13 +799,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -998,13 +815,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1014,13 +831,14 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1030,14 +848,15 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1047,13 +866,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1063,12 +882,13 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1078,13 +898,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1094,12 +914,13 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1109,13 +930,14 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1125,14 +947,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1142,15 +964,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1160,13 +983,14 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1176,13 +1000,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1192,12 +1017,13 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1207,13 +1033,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1223,13 +1049,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1239,15 +1065,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz", + "integrity": "sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1257,13 +1084,14 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1273,13 +1101,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1289,14 +1117,14 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1306,12 +1134,13 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1321,13 +1150,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", - "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.4", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1337,15 +1167,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1355,12 +1185,13 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1370,12 +1201,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", - "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1385,12 +1217,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", - "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1400,13 +1233,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", + "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1415,13 +1248,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1431,12 +1282,13 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1446,13 +1298,14 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1462,12 +1315,13 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1477,12 +1331,13 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1492,12 +1347,13 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1507,12 +1363,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1522,13 +1379,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1538,13 +1396,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1554,13 +1413,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", - "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1570,93 +1430,80 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", - "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.4", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/compat-data": "^7.27.2", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.25.4", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-corejs3": "^0.11.0", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", + "core-js-compat": "^3.40.0", "semver": "^6.3.1" }, "engines": { @@ -1671,6 +1518,7 @@ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -1680,46 +1528,40 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", + "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1728,28 +1570,29 @@ } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@emotion/babel-plugin": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", - "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.2.0", + "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -1761,16 +1604,18 @@ "node_modules/@emotion/babel-plugin/node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" }, "node_modules/@emotion/cache": { - "version": "11.13.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", - "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.0", + "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } @@ -1778,17 +1623,20 @@ "node_modules/@emotion/cache/node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" }, "node_modules/@emotion/hash": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0" } @@ -1796,19 +1644,21 @@ "node_modules/@emotion/memoize": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.13.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", - "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", - "@emotion/cache": "^11.13.0", - "@emotion/serialize": "^1.3.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, @@ -1822,33 +1672,36 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz", - "integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.1", + "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" }, "node_modules/@emotion/styled": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", - "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", + "@emotion/babel-plugin": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.0", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0" + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -1863,25 +1716,29 @@ "node_modules/@emotion/unitless": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", - "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz", - "integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" }, "node_modules/@emotion/weak-memoize": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", @@ -1891,6 +1748,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1907,6 +1765,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1923,6 +1782,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1939,6 +1799,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1955,6 +1816,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1971,6 +1833,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1987,6 +1850,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2003,6 +1867,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2019,6 +1884,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2035,6 +1901,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2051,6 +1918,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2067,6 +1935,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2083,6 +1952,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2099,6 +1969,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2115,6 +1986,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2131,6 +2003,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -2147,6 +2020,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -2163,6 +2037,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -2179,6 +2054,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -2195,6 +2071,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2211,6 +2088,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2227,6 +2105,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -2236,25 +2115,30 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -2264,6 +2148,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2287,6 +2172,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -2302,6 +2188,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2314,6 +2201,7 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2324,6 +2212,7 @@ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -2338,6 +2227,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -2351,12 +2241,14 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2370,6 +2262,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -2378,6 +2271,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -2387,6 +2281,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -2395,12 +2290,14 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2410,6 +2307,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.1.tgz", "integrity": "sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==", + "license": "BSD-2-Clause", "dependencies": { "unist-util-visit": "^1.4.1" }, @@ -2418,18 +2316,20 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", - "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.17.1.tgz", + "integrity": "sha512-OcZj+cs6EfUD39IoPBOgN61zf1XFVY+imsGoBDwXeSq2UHJZE3N59zzBOVjclck91Ne3e9gudONOeILvHCIhUA==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/icons-material": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.7.tgz", - "integrity": "sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.17.1.tgz", + "integrity": "sha512-CN86LocjkunFGG0yPlO4bgqHkNGgaEOEc3X/jG5Bzm401qYw79/SaLrofA7yAKCCXAGdIGnLoMHohc3+ubs95A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9" }, @@ -2442,8 +2342,8 @@ }, "peerDependencies": { "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2452,21 +2352,22 @@ } }, "node_modules/@mui/material": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", - "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.17.1.tgz", + "integrity": "sha512-2B33kQf+GmPnrvXXweWAx+crbiUEsxCdCN979QDYnlH9ox4pd+0/IBriWLV+l6ORoBF60w39cWjFnJYGFdzXcw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.16.7", - "@mui/system": "^5.16.7", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", + "@mui/core-downloads-tracker": "^5.17.1", + "@mui/system": "^5.17.1", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1", - "react-is": "^18.3.1", + "react-is": "^19.0.0", "react-transition-group": "^4.4.5" }, "engines": { @@ -2479,9 +2380,9 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -2496,12 +2397,13 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", - "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.17.1.tgz", + "integrity": "sha512-XMxU0NTYcKqdsG8LRmSoxERPXwMbp16sIXPcLVgLGII/bVNagX0xaheWAwFv8+zDK7tI3ajllkuD3GZZE++ICQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.16.6", + "@mui/utils": "^5.17.1", "prop-types": "^15.8.1" }, "engines": { @@ -2512,8 +2414,8 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2522,12 +2424,13 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", - "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "version": "5.16.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.14.tgz", + "integrity": "sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", + "@emotion/cache": "^11.13.5", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, @@ -2541,7 +2444,7 @@ "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -2553,15 +2456,16 @@ } }, "node_modules/@mui/system": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", - "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.17.1.tgz", + "integrity": "sha512-aJrmGfQpyF0U4D4xYwA6ueVtQcEMebET43CUmKMP7e7iFh3sMIF3sBR0l8Urb4pqx1CBjHAaWgB0ojpND4Q3Jg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.16.6", - "@mui/styled-engine": "^5.16.6", - "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", + "@mui/private-theming": "^5.17.1", + "@mui/styled-engine": "^5.16.14", + "@mui/types": "~7.2.15", + "@mui/utils": "^5.17.1", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -2576,8 +2480,8 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -2592,9 +2496,10 @@ } }, "node_modules/@mui/types": { - "version": "7.2.17", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.17.tgz", - "integrity": "sha512-oyumoJgB6jDV8JFzRqjBo2daUuHpzDjoO/e3IrRhhHo/FxJlaVhET6mcNrKHUq2E+R+q3ql0qAtvQ4rfWHhAeQ==", + "version": "7.2.24", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.24.tgz", + "integrity": "sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==", + "license": "MIT", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -2605,16 +2510,17 @@ } }, "node_modules/@mui/utils": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", - "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.17.1.tgz", + "integrity": "sha512-jEZ8FTqInt2WzxDV8bhImWBqeQRD99c/id/fq83H0ER9tFl+sfZlaAoCdznGvbSQQ9ividMxqSV2c7cC1vBcQg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/types": "^7.2.15", + "@mui/types": "~7.2.15", "@types/prop-types": "^15.7.12", "clsx": "^2.1.1", "prop-types": "^15.8.1", - "react-is": "^18.3.1" + "react-is": "^19.0.0" }, "engines": { "node": ">=12.0.0" @@ -2624,8 +2530,8 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -2638,6 +2544,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2651,6 +2558,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -2660,6 +2568,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2672,15 +2581,17 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@remix-run/router": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", - "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -2689,13 +2600,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "ejs": "^3.1.6", "json5": "^2.2.0", @@ -2708,6 +2621,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -2717,10 +2631,11 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -2730,16 +2645,18 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } @@ -2748,55 +2665,63 @@ "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mdast": { "version": "3.0.15", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "license": "MIT", "dependencies": { "@types/unist": "^2" } }, "node_modules/@types/node": { - "version": "22.7.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", - "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", + "version": "22.15.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.21.tgz", + "integrity": "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.21.0" } }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.10", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.10.tgz", - "integrity": "sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==", + "version": "19.1.5", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.5.tgz", + "integrity": "sha512-piErsCVVbpMMT2r7wbawdZsq4xMvIAhQuac2gedQHysu1TZYEigE6pnFfgZT+/jQnrRuF5r+SHzuehFjfRjr4g==", + "license": "MIT", + "peer": true, "dependencies": { - "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-transition-group": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", - "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", - "dependencies": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { "@types/react": "*" } }, @@ -2805,6 +2730,7 @@ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -2813,43 +2739,48 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", - "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", + "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.24.5", - "@babel/plugin-transform-react-jsx-self": "^7.24.5", - "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@babel/core": "^7.26.10", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" + "react-refresh": "^0.17.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2862,6 +2793,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -2871,6 +2803,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2887,44 +2820,53 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, - "dependencies": { - "deep-equal": "^2.0.5" + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -2938,6 +2880,7 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2958,6 +2901,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2974,17 +2918,19 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2994,15 +2940,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3012,15 +2959,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3034,6 +2982,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -3046,19 +2995,19 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -3071,19 +3020,32 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 4.0.0" } @@ -3093,6 +3055,7 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -3104,10 +3067,11 @@ } }, "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", "dev": true, + "license": "MPL-2.0", "engines": { "node": ">=4" } @@ -3117,6 +3081,7 @@ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">= 0.4" } @@ -3125,6 +3090,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -3136,13 +3102,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.4", "semver": "^6.3.1" }, "peerDependencies": { @@ -3150,25 +3117,27 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.4" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3178,6 +3147,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -3187,13 +3157,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3204,6 +3176,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -3212,9 +3185,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "dev": true, "funding": [ { @@ -3230,11 +3203,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -3247,13 +3221,15 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -3262,16 +3238,47 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -3284,14 +3291,15 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001664", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz", - "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==", + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", "dev": true, "funding": [ { @@ -3306,33 +3314,31 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/character-entities": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -3342,6 +3348,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -3351,6 +3358,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -3360,27 +3368,36 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, "node_modules/comma-separated-tokens": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -3390,13 +3407,15 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -3405,26 +3424,30 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.23.3" + "browserslist": "^4.24.4" }, "funding": { "type": "opencollective", @@ -3435,6 +3458,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -3450,15 +3474,17 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "license": "MIT", "dependencies": { "node-fetch": "2.6.7" } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3473,6 +3499,7 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3481,6 +3508,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssjanus/-/cssjanus-2.3.0.tgz", "integrity": "sha512-ZZXXn51SnxRxAZ6fdY7mBDPmA4OZd83q/J9Gdqz3YmE9TUq+9tZl+tdOnCi7PpNygI6PEkehj9rgifv5+W8a5A==", + "license": "Apache-2.0", "engines": { "node": ">=10.0.0" } @@ -3488,23 +3516,26 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3514,29 +3545,31 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -3548,9 +3581,10 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -3563,49 +3597,19 @@ } } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3615,6 +3619,7 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -3632,6 +3637,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -3648,6 +3654,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.7.tgz", "integrity": "sha512-2a+BXvVhY5op+smDRLxeBAivE7YcYaneXJ1la3HOkUfX9zKkE/AJ8CNgjiXbtXepFyFmJNGSbmjOwqbT749r/w==", + "license": "Apache-2.0", "engines": { "node": ">=6.0" } @@ -3656,6 +3663,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/dexie-react-hooks/-/dexie-react-hooks-1.1.7.tgz", "integrity": "sha512-Lwv5W0Hk+uOW3kGnsU9GZoR1er1B7WQ5DSdonoNG+focTNeJbHW6vi6nBoX534VKI3/uwHebYzSw1fwY6a7mTw==", + "license": "Apache-2.0", "peerDependencies": { "@types/react": ">=16", "dexie": "^3.2 || ^4.0.1-alpha", @@ -3667,6 +3675,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3678,16 +3687,33 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -3699,21 +3725,24 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.29", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz", - "integrity": "sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==", - "dev": true + "version": "1.5.155", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", + "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -3722,62 +3751,69 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.10", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.10.tgz", + "integrity": "sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==", "dev": true, + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -3787,13 +3823,11 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3803,60 +3837,45 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -3865,37 +3884,44 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -3910,6 +3936,7 @@ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -3946,6 +3973,7 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3954,6 +3982,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -3965,7 +3994,9 @@ "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -4021,6 +4052,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", "dev": true, + "license": "MIT", "dependencies": { "eslint-config-airbnb-base": "^15.0.0", "object.assign": "^4.1.2", @@ -4042,6 +4074,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, + "license": "MIT", "dependencies": { "confusing-browser-globals": "^1.0.10", "object.assign": "^4.1.2", @@ -4061,6 +4094,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -4073,6 +4107,7 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -4084,6 +4119,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -4093,6 +4129,7 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -4110,15 +4147,17 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", - "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", @@ -4128,7 +4167,7 @@ "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.9.0", + "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", @@ -4137,13 +4176,14 @@ "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { @@ -4151,6 +4191,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -4160,6 +4201,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -4168,12 +4210,13 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", - "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", "dev": true, + "license": "MIT", "dependencies": { - "aria-query": "~5.1.3", + "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", @@ -4181,14 +4224,13 @@ "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" + "string.prototype.includes": "^2.0.1" }, "engines": { "node": ">=4.0" @@ -4198,28 +4240,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.0.tgz", - "integrity": "sha512-IHBePmfWH5lKhJnJ7WB1V+v/GolbB0rjS8XYVCSQCZKaQCAUhMoVoOEn1Ef8Z8Wf0a7l8KTJvuZg5/e4qrZ6nA==", + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", + "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.8", + "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", + "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "engines": { @@ -4234,6 +4277,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4246,6 +4290,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -4258,6 +4303,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -4275,6 +4321,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -4291,6 +4338,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4298,60 +4346,12 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -4362,32 +4362,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -4400,6 +4380,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -4417,6 +4398,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -4429,6 +4411,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -4441,6 +4424,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -4449,13 +4433,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -4463,25 +4449,28 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -4492,6 +4481,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -4503,25 +4493,39 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", - "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==", - "dev": true + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -4531,6 +4535,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -4543,6 +4548,7 @@ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } @@ -4552,6 +4558,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -4561,6 +4568,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4573,6 +4581,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4583,13 +4592,15 @@ "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -4606,6 +4617,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -4616,18 +4628,26 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/fs-extra": { @@ -4635,6 +4655,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -4649,7 +4670,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -4657,6 +4679,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4669,20 +4692,24 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -4696,6 +4723,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4705,21 +4733,28 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4732,17 +4767,33 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -4757,6 +4808,7 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4777,6 +4829,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -4788,6 +4841,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", "engines": { "node": ">=4" } @@ -4797,6 +4851,7 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -4809,12 +4864,13 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4824,29 +4880,37 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { @@ -4854,6 +4918,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -4862,10 +4927,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -4874,10 +4943,11 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4890,6 +4960,7 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -4904,6 +4975,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -4915,6 +4987,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.3", "comma-separated-tokens": "^1.0.0", @@ -4933,6 +5006,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } @@ -4940,20 +5014,23 @@ "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/html-parse-stringify": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", "dependencies": { "void-elements": "3.1.0" } }, "node_modules/humanize-duration": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.32.1.tgz", - "integrity": "sha512-inh5wue5XdfObhu/IGEMiA1nUXigSGcaKNemcbLRKa7jXYGDZXr3LoT9pTIzq2hPEbld7w/qv9h+ikWGz8fL1g==" + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.32.2.tgz", + "integrity": "sha512-jcTwWYeCJf4dN5GJnjBmHd42bNyK94lY49QTkrsAQrMTUoIYLevvDpmQtg5uv8ZrdIRIbzdasmSNZ278HHUPEg==", + "license": "Unlicense" }, "node_modules/i18next": { "version": "21.10.0", @@ -4973,6 +5050,7 @@ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" } ], + "license": "MIT", "dependencies": { "@babel/runtime": "^7.17.2" } @@ -4981,6 +5059,7 @@ "version": "6.1.8", "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-6.1.8.tgz", "integrity": "sha512-Svm+MduCElO0Meqpj1kJAriTC6OhI41VhlT/A0UPjGoPZBhAHIaGE5EfsHlTpgdH09UVX7rcc72pSDDBeKSQQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.19.0" } @@ -4989,6 +5068,7 @@ "version": "1.4.5", "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-1.4.5.tgz", "integrity": "sha512-tLuHWuLWl6CmS07o+UB6EcQCaUjrZ1yhdseIN7sfq0u7phsMePJ8pqlGhIAdRDPF/q7ooyo5MID5DRFBCH+x5w==", + "license": "MIT", "dependencies": { "cross-fetch": "3.1.5" } @@ -4997,21 +5077,24 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -5028,6 +5111,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -5038,6 +5122,7 @@ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5047,22 +5132,25 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5072,6 +5160,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5081,6 +5170,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" @@ -5090,30 +5180,16 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -5125,15 +5201,21 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5143,25 +5225,30 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5188,6 +5275,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "engines": { "node": ">=4" } @@ -5197,6 +5285,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5205,9 +5294,10 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -5219,11 +5309,14 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, + "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -5234,12 +5327,14 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5252,6 +5347,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5262,29 +5358,38 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5298,6 +5403,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -5309,6 +5415,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5319,6 +5426,7 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5330,36 +5438,28 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5373,6 +5473,7 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5382,6 +5483,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5390,18 +5492,22 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -5415,6 +5521,7 @@ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5424,6 +5531,7 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5432,12 +5540,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5451,6 +5560,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -5459,12 +5569,14 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5474,12 +5586,15 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5489,12 +5604,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -5508,6 +5624,7 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5516,25 +5633,30 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -5547,25 +5669,32 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/jake": { @@ -5573,6 +5702,7 @@ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -5586,81 +5716,12 @@ "node": ">=10" } }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -5670,42 +5731,24 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/js-base64": { "version": "3.7.7", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", - "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==", + "license": "BSD-3-Clause" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -5714,50 +5757,57 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -5770,6 +5820,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -5782,6 +5833,7 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5791,6 +5843,7 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -5806,6 +5859,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -5814,13 +5868,15 @@ "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/language-tags": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, + "license": "MIT", "dependencies": { "language-subtag-registry": "^0.3.20" }, @@ -5833,6 +5889,7 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5842,6 +5899,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5853,13 +5911,15 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -5874,30 +5934,35 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -5910,6 +5975,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -5919,14 +5985,26 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, + "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.8" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-definitions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "license": "MIT", "dependencies": { "unist-util-visit": "^2.0.0" }, @@ -5939,6 +6017,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", @@ -5953,6 +6032,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" @@ -5966,6 +6046,7 @@ "version": "0.8.5", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-string": "^2.0.0", @@ -5982,6 +6063,7 @@ "version": "10.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz", "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -6001,6 +6083,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", @@ -6015,6 +6098,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" @@ -6028,6 +6112,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -6036,19 +6121,22 @@ "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -6067,6 +6155,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "debug": "^4.0.0", "parse-entities": "^2.0.0" @@ -6077,6 +6166,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -6090,6 +6180,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6102,6 +6193,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6109,12 +6201,13 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -6122,6 +6215,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -6133,12 +6227,14 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -6155,40 +6251,27 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6201,19 +6284,23 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -6224,14 +6311,16 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -6242,6 +6331,7 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -6260,6 +6350,7 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -6270,12 +6361,14 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -6291,6 +6384,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -6300,6 +6394,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -6312,11 +6407,30 @@ "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -6332,6 +6446,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -6346,6 +6461,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -6357,6 +6473,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", @@ -6374,6 +6491,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -6392,6 +6510,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6401,6 +6520,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6410,6 +6530,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6417,26 +6538,30 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -6445,18 +6570,19 @@ } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -6472,9 +6598,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -6486,6 +6613,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -6495,6 +6623,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -6510,6 +6639,7 @@ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14.13.1 || >=16.0.0" }, @@ -6521,6 +6651,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -6530,12 +6661,14 @@ "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, "node_modules/property-information": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", "dependencies": { "xtend": "^4.0.0" }, @@ -6549,6 +6682,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6571,44 +6705,45 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.1.0" } }, "node_modules/react-i18next": { "version": "11.18.6", "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.18.6.tgz", "integrity": "sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.14.5", "html-parse-stringify": "^3.0.1" @@ -6630,6 +6765,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz", "integrity": "sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==", + "license": "MIT", "dependencies": { "throttle-debounce": "^2.1.0" }, @@ -6638,15 +6774,17 @@ } }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", + "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", + "license": "MIT" }, "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6655,6 +6793,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/react-remark/-/react-remark-2.1.0.tgz", "integrity": "sha512-7dEPxRGQ23sOdvteuRGaQAs9cEOH/BOeCN4CqsJdk3laUDIDYRCWnM6a3z92PzXHUuxIRLXQNZx7SiO0ijUcbw==", + "license": "MIT", "dependencies": { "rehype-react": "^6.0.0", "remark-parse": "^9.0.0", @@ -6673,11 +6812,12 @@ } }, "node_modules/react-router": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", - "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.1.tgz", + "integrity": "sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.2" + "@remix-run/router": "1.23.0" }, "engines": { "node": ">=14.0.0" @@ -6687,12 +6827,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", - "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", + "version": "6.30.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.1.tgz", + "integrity": "sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.19.2", - "react-router": "6.26.2" + "@remix-run/router": "1.23.0", + "react-router": "6.30.1" }, "engines": { "node": ">=14.0.0" @@ -6706,6 +6847,7 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -6718,18 +6860,20 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -6742,13 +6886,15 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -6756,30 +6902,19 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6789,15 +6924,16 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -6805,31 +6941,44 @@ "node": ">=4" } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" } }, "node_modules/rehype-react": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-6.2.1.tgz", "integrity": "sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==", + "license": "MIT", "dependencies": { "@mapbox/hast-util-table-cell-style": "^0.2.0", "hast-to-hyperscript": "^9.0.0" @@ -6843,6 +6992,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^0.8.0" }, @@ -6855,6 +7005,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-8.1.0.tgz", "integrity": "sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==", + "license": "MIT", "dependencies": { "mdast-util-to-hast": "^10.2.0" }, @@ -6868,22 +7019,27 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6892,15 +7048,17 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -6912,6 +7070,7 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -6927,6 +7086,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -6957,19 +7117,22 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -6997,17 +7160,36 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -7017,18 +7199,17 @@ } }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -7038,6 +7219,7 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -7047,6 +7229,7 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -7064,6 +7247,7 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -7074,11 +7258,27 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -7091,20 +7291,79 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7117,6 +7376,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7126,6 +7386,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7135,6 +7396,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -7145,6 +7407,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7154,12 +7417,14 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/space-separated-tokens": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -7169,6 +7434,7 @@ "version": "2.0.10", "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } @@ -7176,12 +7442,14 @@ "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" }, "node_modules/stacktrace-gps": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "license": "MIT", "dependencies": { "source-map": "0.5.6", "stackframe": "^1.3.4" @@ -7191,6 +7459,7 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7199,52 +7468,48 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "license": "MIT", "dependencies": { "error-stack-parser": "^2.0.6", "stack-generator": "^2.0.5", "stacktrace-gps": "^3.0.4" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", "dev": true, + "license": "MIT", "dependencies": { - "internal-slot": "^1.0.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" }, "engines": { "node": ">= 0.4" } }, - "node_modules/string.prototype.includes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", - "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7258,21 +7523,26 @@ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7282,15 +7552,20 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7300,6 +7575,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -7317,6 +7593,7 @@ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -7331,6 +7608,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7343,6 +7621,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -7352,6 +7631,7 @@ "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -7361,6 +7641,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -7372,19 +7653,22 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "license": "MIT", "dependencies": { "inline-style-parser": "0.1.1" } }, "node_modules/stylis": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", - "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==" + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" }, "node_modules/stylis-plugin-rtl": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz", "integrity": "sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==", + "license": "MIT", "dependencies": { "cssjanus": "^2.0.1" }, @@ -7393,20 +7677,23 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7419,6 +7706,7 @@ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7428,6 +7716,7 @@ "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "dev": true, + "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", @@ -7442,13 +7731,14 @@ } }, "node_modules/terser": { - "version": "5.34.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz", - "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==", + "version": "5.39.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.2.tgz", + "integrity": "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -7463,29 +7753,24 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/throttle-debounce": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -7496,12 +7781,14 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, "node_modules/trough": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -7512,6 +7799,7 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -7524,6 +7812,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -7536,6 +7825,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -7548,6 +7838,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -7556,30 +7847,32 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -7589,17 +7882,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -7609,17 +7904,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -7629,31 +7925,37 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -7663,6 +7965,7 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -7676,6 +7979,7 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -7685,6 +7989,7 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -7693,6 +7998,7 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "license": "MIT", "dependencies": { "bail": "^1.0.0", "extend": "^3.0.0", @@ -7711,6 +8017,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, + "license": "MIT", "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -7722,6 +8029,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -7731,6 +8039,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -7740,6 +8049,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -7749,6 +8059,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -7758,6 +8069,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.2" }, @@ -7770,6 +8082,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "license": "MIT", "dependencies": { "unist-util-visit-parents": "^2.0.0" } @@ -7778,6 +8091,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "license": "MIT", "dependencies": { "unist-util-is": "^3.0.0" } @@ -7785,13 +8099,15 @@ "node_modules/unist-util-visit-parents/node_modules/unist-util-is": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "license": "MIT" }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -7801,15 +8117,16 @@ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4", "yarn": "*" } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -7825,9 +8142,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -7841,6 +8159,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -7849,6 +8168,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -7864,6 +8184,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^2.0.0" @@ -7874,10 +8195,11 @@ } }, "node_modules/vite": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", - "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz", + "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -7933,6 +8255,7 @@ "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.15.2.tgz", "integrity": "sha512-l1srtaad5NMNrAtAuub6ArTYG5Ci9AwofXXQ6IsbpCMYQ/0HUndwI7RB2x95+1UBFm7VGttQtT7woBlVnNhBRw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4", "fast-glob": "^3.2.12", @@ -7953,6 +8276,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7961,6 +8285,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -7969,12 +8294,14 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -7985,6 +8312,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -7996,39 +8324,45 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, + "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, + "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", + "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -8042,6 +8376,7 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -8056,15 +8391,18 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -8079,6 +8417,7 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8088,6 +8427,7 @@ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", "dev": true, + "license": "MIT", "dependencies": { "idb": "^7.0.1", "workbox-core": "6.6.0" @@ -8098,6 +8438,7 @@ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", "dev": true, + "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -8107,6 +8448,7 @@ "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", "dev": true, + "license": "MIT", "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", @@ -8155,6 +8497,7 @@ "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", "dev": true, + "license": "MIT", "dependencies": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", @@ -8172,6 +8515,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" @@ -8195,6 +8539,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", @@ -8215,6 +8560,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" @@ -8228,6 +8574,7 @@ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", @@ -8245,6 +8592,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -8260,13 +8608,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/workbox-build/node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -8279,6 +8629,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -8295,6 +8646,7 @@ "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", @@ -8310,6 +8662,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "whatwg-url": "^7.0.0" }, @@ -8322,6 +8675,7 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^2.1.0" } @@ -8330,13 +8684,15 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/workbox-build/node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, + "license": "MIT", "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -8349,6 +8705,7 @@ "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", "deprecated": "workbox-background-sync@6.6.0", "dev": true, + "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -8357,13 +8714,15 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/workbox-expiration": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", "dev": true, + "license": "MIT", "dependencies": { "idb": "^7.0.1", "workbox-core": "6.6.0" @@ -8375,6 +8734,7 @@ "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", "dev": true, + "license": "MIT", "dependencies": { "workbox-background-sync": "6.6.0", "workbox-core": "6.6.0", @@ -8387,6 +8747,7 @@ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", "dev": true, + "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -8396,6 +8757,7 @@ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", "dev": true, + "license": "MIT", "dependencies": { "workbox-core": "6.6.0", "workbox-routing": "6.6.0", @@ -8407,6 +8769,7 @@ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", "dev": true, + "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -8416,6 +8779,7 @@ "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", "dev": true, + "license": "MIT", "dependencies": { "workbox-cacheable-response": "6.6.0", "workbox-core": "6.6.0", @@ -8430,6 +8794,7 @@ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", "dev": true, + "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -8439,6 +8804,7 @@ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", "dev": true, + "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } @@ -8448,6 +8814,7 @@ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", "dev": true, + "license": "MIT", "dependencies": { "workbox-core": "6.6.0", "workbox-routing": "6.6.0" @@ -8457,13 +8824,15 @@ "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/workbox-window": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", "dev": true, + "license": "MIT", "dependencies": { "@types/trusted-types": "^2.0.2", "workbox-core": "6.6.0" @@ -8473,12 +8842,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", "engines": { "node": ">=0.4" } @@ -8487,12 +8858,14 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", "engines": { "node": ">= 6" } @@ -8502,6 +8875,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, From bd192edf1e2a2c953cef2b6f79bb1a799bce2371 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 21 May 2025 18:52:45 -0400 Subject: [PATCH 037/117] Release notes --- docs/releases.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releases.md b/docs/releases.md index 69222b82..5d0f0be9 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1382,6 +1382,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** * Add `Date` header to outgoing emails to avoid rejection ([#1141](https://github.com/binwiederhier/ntfy/pull/1141), thanks to [pcouy](https://github.com/pcouy)) +* Security updates for dependencies and Docker images **Documentation:** From 0ad266a495356acaf6d8fada12421919b2a14a2a Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 21 May 2025 18:53:29 -0400 Subject: [PATCH 038/117] Derp --- docs/releases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases.md b/docs/releases.md index 5d0f0be9..002e0d06 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1382,7 +1382,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** * Add `Date` header to outgoing emails to avoid rejection ([#1141](https://github.com/binwiederhier/ntfy/pull/1141), thanks to [pcouy](https://github.com/pcouy)) -* Security updates for dependencies and Docker images +* Security updates for dependencies and Docker images ([#1341](https://github.com/binwiederhier/ntfy/pull/1341)) **Documentation:** From 3f21da7768f29e5707d18fd85c3bb29994e101b9 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 21 May 2025 18:55:21 -0400 Subject: [PATCH 039/117] Pipelines --- .github/workflows/build.yaml | 2 +- .github/workflows/release.yaml | 2 +- .github/workflows/test.yaml | 2 +- Dockerfile-build | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index b6dc8ddb..72b9e360 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -9,7 +9,7 @@ jobs: - name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.22.x' + go-version: '1.24.x' - name: Install node uses: actions/setup-node@v3 with: diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 80155e5b..70a70552 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -12,7 +12,7 @@ jobs: - name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.22.x' + go-version: '1.24.x' - name: Install node uses: actions/setup-node@v3 with: diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index b0f99ffd..cfd9d754 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -9,7 +9,7 @@ jobs: - name: Install Go uses: actions/setup-go@v4 with: - go-version: '1.22.x' + go-version: '1.24.x' - name: Install node uses: actions/setup-node@v3 with: diff --git a/Dockerfile-build b/Dockerfile-build index 4530ec47..832b85bf 100644 --- a/Dockerfile-build +++ b/Dockerfile-build @@ -1,4 +1,4 @@ -FROM golang:1.22-bullseye as builder +FROM golang:1.24-bullseye as builder ARG VERSION=dev ARG COMMIT=unknown From 1569c22a65898526c834c3be041212ca81964a9a Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 21 May 2025 20:02:06 -0400 Subject: [PATCH 040/117] Fix some broken links in the docs --- docs/config.md | 2 +- docs/develop.md | 2 +- docs/examples.md | 54 +++++++++++++++++++------------------------ docs/publish.md | 4 ++-- docs/releases.md | 9 ++++++-- docs/subscribe/api.md | 4 ++-- 6 files changed, 37 insertions(+), 38 deletions(-) diff --git a/docs/config.md b/docs/config.md index d4766cde..d6438e16 100644 --- a/docs/config.md +++ b/docs/config.md @@ -1382,7 +1382,7 @@ variable before running the `ntfy` command (e.g. `export NTFY_LISTEN_HTTP=:80`). | `firebase-key-file` | `NTFY_FIREBASE_KEY_FILE` | *filename* | - | If set, also publish messages to a Firebase Cloud Messaging (FCM) topic for your app. This is optional and only required to save battery when using the Android app. See [Firebase (FCM](#firebase-fcm). | | `cache-file` | `NTFY_CACHE_FILE` | *filename* | - | If set, messages are cached in a local SQLite database instead of only in-memory. This allows for service restarts without losing messages in support of the since= parameter. See [message cache](#message-cache). | | `cache-duration` | `NTFY_CACHE_DURATION` | *duration* | 12h | Duration for which messages will be buffered before they are deleted. This is required to support the `since=...` and `poll=1` parameter. Set this to `0` to disable the cache entirely. | -| `cache-startup-queries` | `NTFY_CACHE_STARTUP_QUERIES` | *string (SQL queries)* | - | SQL queries to run during database startup; this is useful for tuning and [enabling WAL mode](#wal-for-message-cache) | +| `cache-startup-queries` | `NTFY_CACHE_STARTUP_QUERIES` | *string (SQL queries)* | - | SQL queries to run during database startup; this is useful for tuning and [enabling WAL mode](#message-cache) | | `cache-batch-size` | `NTFY_CACHE_BATCH_SIZE` | *int* | 0 | Max size of messages to batch together when writing to message cache (if zero, writes are synchronous) | | `cache-batch-timeout` | `NTFY_CACHE_BATCH_TIMEOUT` | *duration* | 0s | Timeout for batched async writes to the message cache (if zero, writes are synchronous) | | `auth-file` | `NTFY_AUTH_FILE` | *filename* | - | Auth database file used for access control. If set, enables authentication and access control. See [access control](#access-control). | diff --git a/docs/develop.md b/docs/develop.md index e343503b..43ac2d4f 100644 --- a/docs/develop.md +++ b/docs/develop.md @@ -384,7 +384,7 @@ strictly based off of my development on this app. There may be other versions of ### Apple setup !!! info - Along with this step, the [PLIST Deployment](#plist-deployment-and-configuration) step is also required + Along with this step, the [PLIST Deployment](#plist-config) step is also required for these changes to take effect in the iOS app. 1. [Create a new key in Apple Developer Member Center](https://developer.apple.com/account/resources/authkeys/add) diff --git a/docs/examples.md b/docs/examples.md index 18523716..343de120 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -639,44 +639,39 @@ or by simply providing traccar with a valid username/password combination. This example provides a simple way to send notifications using [ntfy.sh](https://ntfy.sh) when a terminal command completes. It includes success or failure indicators based on the command's exit status. -### Setup - -1. Store your ntfy.sh bearer token securely if access control is enabled: +Store your ntfy.sh bearer token securely if access control is enabled: ```sh echo "your_bearer_token_here" > ~/.ntfy_token chmod 600 ~/.ntfy_token ``` -1. Add the following function and alias to your `.bashrc` or `.bash_profile`: +Add the following function and alias to your `.bashrc` or `.bash_profile`: - ```sh - # Function for alert notifications using ntfy.sh - notify_via_ntfy() { - local exit_status=$? # Capture the exit status before doing anything else - local token=$(< ~/.ntfy_token) # Securely read the token - local status_icon="$([ $exit_status -eq 0 ] && echo magic_wand || echo warning)" - local last_command=$(history | tail -n1 | sed -e 's/^[[:space:]]*[0-9]\{1,\}[[:space:]]*//' -e 's/[;&|][[:space:]]*alert$//') + ```sh + # Function for alert notifications using ntfy.sh + notify_via_ntfy() { + local exit_status=$? # Capture the exit status before doing anything else + local token=$(< ~/.ntfy_token) # Securely read the token + local status_icon="$([ $exit_status -eq 0 ] && echo magic_wand || echo warning)" + local last_command=$(history | tail -n1 | sed -e 's/^[[:space:]]*[0-9]\{1,\}[[:space:]]*//' -e 's/[;&|][[:space:]]*alert$//') - curl -s -X POST "https://n.example.dev/alerts" \ - -H "Authorization: Bearer $token" \ - -H "Title: Terminal" \ - -H "X-Priority: 3" \ - -H "Tags: $status_icon" \ - -d "Command: $last_command (Exit: $exit_status)" + curl -s -X POST "https://n.example.dev/alerts" \ + -H "Authorization: Bearer $token" \ + -H "Title: Terminal" \ + -H "X-Priority: 3" \ + -H "Tags: $status_icon" \ + -d "Command: $last_command (Exit: $exit_status)" - echo "Tags: $status_icon" - echo "$last_command (Exit: $exit_status)" - } + echo "Tags: $status_icon" + echo "$last_command (Exit: $exit_status)" + } - # Add an "alert" alias for long running commands using ntfy.sh - alias alert='notify_via_ntfy' + # Add an "alert" alias for long running commands using ntfy.sh + alias alert='notify_via_ntfy' + ``` - ``` - -### Usage - -Run any long-running command and append `alert` to notify when it completes: +Now you can run any long-running command and append `alert` to notify when it completes: ```sh sleep 10; alert @@ -685,11 +680,10 @@ sleep 10; alert **Notification Sent** with a success 🪄 (`magic_wand`) or failure ⚠️ (`warning`) tag. -#### Simulating Failures - To test failure notifications: ```sh false; alert # Always fails (exit 1) ls --invalid; alert # Invalid option -cat nonexistent_file; alert # File not found \ No newline at end of file +cat nonexistent_file; alert # File not found +``` \ No newline at end of file diff --git a/docs/publish.md b/docs/publish.md index 37b46809..25bff035 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -1243,7 +1243,7 @@ all the supported fields: | `priority` | - | *int (one of: 1, 2, 3, 4, or 5)* | `4` | Message [priority](#message-priority) with 1=min, 3=default and 5=max | | `actions` | - | *JSON array* | *(see [action buttons](#action-buttons))* | Custom [user action buttons](#action-buttons) for notifications | | `click` | - | *URL* | `https://example.com` | Website opened when notification is [clicked](#click-action) | -| `attach` | - | *URL* | `https://example.com/file.jpg` | URL of an attachment, see [attach via URL](#attach-file-from-url) | +| `attach` | - | *URL* | `https://example.com/file.jpg` | URL of an attachment, see [attach via URL](#attach-file-from-a-url) | | `markdown` | - | *bool* | `true` | Set to true if the `message` is Markdown-formatted | | `icon` | - | *string* | `https://example.com/icon.png` | URL to use as notification [icon](#icons) | | `filename` | - | *string* | `file.jpg` | File name of the attachment | @@ -3094,7 +3094,7 @@ may be read/write protected so that only users with the correct credentials can To publish/subscribe to protected topics, you can: * Use [username & password](#username-password) via Basic auth, e.g. `Authorization: Basic dGVzdHVzZXI6ZmFrZXBhc3N3b3Jk` -* Use [access tokens](#bearer-auth) via Bearer/Basic auth, e.g. `Authorization: Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2` +* Use [access tokens](#access-tokens) via Bearer/Basic auth, e.g. `Authorization: Bearer tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2` * or use either with the [`auth` query parameter](#query-param), e.g. `?auth=QmFzaWMgZEdWemRIVnpaWEk2Wm1GclpYQmhjM04zYjNKaw` !!! warning diff --git a/docs/releases.md b/docs/releases.md index 002e0d06..65af14d5 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -689,7 +689,7 @@ minute or so, due to competing stats gathering (personal installations will like **Features:** -* Add `cache-startup-queries` option to allow custom [SQLite performance tuning](config.md#wal-for-message-cache) (no ticket) +* Add `cache-startup-queries` option to allow custom [SQLite performance tuning](config.md#message-cache) (no ticket) * ntfy CLI can now [wait for a command or PID](subscribe/cli.md#wait-for-pidcommand) before publishing ([#263](https://github.com/binwiederhier/ntfy/issues/263), thanks to the [original ntfy](https://github.com/dschep/ntfy) for the idea) * Trace: Log entire HTTP request to simplify debugging (no ticket) * Allow setting user password via `NTFY_PASSWORD` env variable ([#327](https://github.com/binwiederhier/ntfy/pull/327), thanks to [@Kenix3](https://github.com/Kenix3)) @@ -1381,16 +1381,21 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** -* Add `Date` header to outgoing emails to avoid rejection ([#1141](https://github.com/binwiederhier/ntfy/pull/1141), thanks to [pcouy](https://github.com/pcouy)) +* Add `Date` header to outgoing emails to avoid rejection ([#1141](https://github.com/binwiederhier/ntfy/pull/1141), thanks to [@pcouy](https://github.com/pcouy)) * Security updates for dependencies and Docker images ([#1341](https://github.com/binwiederhier/ntfy/pull/1341)) +* Fix IP address parsing when behind a proxy ([#1266](https://github.com/binwiederhier/ntfy/pull/1266), thanks to [@mmatuska](https://github.com/mmatuska)) +* Make sure UnifiedPush messages are not treated as attachments ([#1312](https://github.com/binwiederhier/ntfy/pull/1312), thanks to [@vkrause](https://github.com/vkrause)) +* Add OCI image version to Docker image ([#1307](https://github.com/binwiederhier/ntfy/pull/1307), thanks to [@jlssmt](https://github.com/jlssmt)) **Documentation:** +* Lots of new integrations: [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp), [UptimeObserver](https://uptimeobserver.com), [alertmanager-ntfy-relay](https://github.com/therobbielee/alertmanager-ntfy-relay), [Monibot](https://monibot.io/), ... Amazing! * Various docs updates ([#1161](https://github.com/binwiederhier/ntfy/pull/1161), thanks to [@OneWeekNotice](https://github.com/OneWeekNotice)) * Typo in config docs ([#1177](https://github.com/binwiederhier/ntfy/pull/1177), thanks to [@hoho4190](https://github.com/hoho4190)) * Typo in CLI docs ([#1172](https://github.com/binwiederhier/ntfy/pull/1172), thanks to [@anirvan](https://github.com/anirvan)) * Correction about MacroDroid ([#1137](https://github.com/binwiederhier/ntfy/pull/1137), thanks to [@ShlomoCode](https://github.com/ShlomoCode)) * Note about fail2ban in Docker ([#1175](https://github.com/binwiederhier/ntfy/pull/1175)), thanks to [@Measurity](https://github.com/Measurity)) +* Lots of other tiny docs updates, tanks to everyone who contributed! ### ntfy Android app v1.16.1 (UNRELEASED) diff --git a/docs/subscribe/api.md b/docs/subscribe/api.md index 3f1c0e81..5dad35b4 100644 --- a/docs/subscribe/api.md +++ b/docs/subscribe/api.md @@ -132,7 +132,7 @@ easy to use. Here's what it looks like. You may also want to check out the [full ### Subscribe as raw stream The `/raw` endpoint will output one line per message, and **will only include the message body**. It's useful for extremely simple scripts, and doesn't include all the data. Additional fields such as [priority](../publish.md#message-priority), -[tags](../publish.md#tags--emojis--) or [message title](../publish.md#message-title) are not included in this output +[tags](../publish.md#tags-emojis) or [message title](../publish.md#message-title) are not included in this output format. Keepalive messages are sent as empty lines. === "Command line (curl)" @@ -305,7 +305,7 @@ Depending on whether the server is configured to support [access control](../con may be read/write protected so that only users with the correct credentials can subscribe or publish to them. To publish/subscribe to protected topics, you can: -* Use [basic auth](../publish.md#basic-auth), e.g. `Authorization: Basic dGVzdHVzZXI6ZmFrZXBhc3N3b3Jk` +* Use [basic auth](../publish.md#authentication), e.g. `Authorization: Basic dGVzdHVzZXI6ZmFrZXBhc3N3b3Jk` * or use the [`auth` query parameter](../publish.md#query-param), e.g. `?auth=QmFzaWMgZEdWemRIVnpaWEk2Wm1GclpYQmhjM04zYjNKaw` Please refer to the [publishing documentation](../publish.md#authentication) for additional details. From 7aab7d387f72b5ec6ac54faa4092f59fb03deb42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 May 2025 00:04:33 +0000 Subject: [PATCH 041/117] Bump esbuild, vite and vite-plugin-pwa in /web Bumps [esbuild](https://github.com/evanw/esbuild) to 0.25.4 and updates ancestor dependencies [esbuild](https://github.com/evanw/esbuild), [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) and [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa). These dependencies need to be updated together. Updates `esbuild` from 0.18.20 to 0.25.4 - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2023.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.18.20...v0.25.4) Updates `vite` from 4.5.14 to 6.3.5 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v6.3.5/packages/vite) Updates `vite-plugin-pwa` from 0.15.2 to 1.0.0 - [Release notes](https://github.com/vite-pwa/vite-plugin-pwa/releases) - [Commits](https://github.com/vite-pwa/vite-plugin-pwa/compare/v0.15.2...v1.0.0) --- updated-dependencies: - dependency-name: esbuild dependency-version: 0.25.4 dependency-type: indirect - dependency-name: vite dependency-version: 6.3.5 dependency-type: direct:development - dependency-name: vite-plugin-pwa dependency-version: 1.0.0 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- web/package-lock.json | 1222 ++++++++++++++++++++++++++--------------- web/package.json | 4 +- 2 files changed, 793 insertions(+), 433 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index 813da25a..7a08b299 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -12,7 +12,7 @@ "@emotion/react": "^11.11.0", "@emotion/styled": "^11.11.0", "@mui/icons-material": "^5.4.2", - "@mui/material": "latest", + "@mui/material": "*", "dexie": "^3.2.1", "dexie-react-hooks": "^1.1.1", "humanize-duration": "^3.27.3", @@ -20,8 +20,8 @@ "i18next-browser-languagedetector": "^6.1.4", "i18next-http-backend": "^1.4.0", "js-base64": "^3.7.2", - "react": "latest", - "react-dom": "latest", + "react": "*", + "react-dom": "*", "react-i18next": "^11.16.2", "react-infinite-scroll-component": "^6.1.0", "react-remark": "^2.1.0", @@ -41,8 +41,8 @@ "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "prettier": "^2.8.8", - "vite": "^4.3.9", - "vite-plugin-pwa": "^0.15.0" + "vite": "^6.3.5", + "vite-plugin-pwa": "^1.0.0" } }, "node_modules/@ampproject/remapping": { @@ -1740,10 +1740,27 @@ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", "license": "MIT" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", "cpu": [ "arm" ], @@ -1754,13 +1771,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", "cpu": [ "arm64" ], @@ -1771,13 +1788,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", "cpu": [ "x64" ], @@ -1788,13 +1805,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", "cpu": [ "arm64" ], @@ -1805,13 +1822,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", "cpu": [ "x64" ], @@ -1822,13 +1839,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", "cpu": [ "arm64" ], @@ -1839,13 +1856,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", "cpu": [ "x64" ], @@ -1856,13 +1873,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", "cpu": [ "arm" ], @@ -1873,13 +1890,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", "cpu": [ "arm64" ], @@ -1890,13 +1907,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", "cpu": [ "ia32" ], @@ -1907,13 +1924,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", "cpu": [ "loong64" ], @@ -1924,13 +1941,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", "cpu": [ "mips64el" ], @@ -1941,13 +1958,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", "cpu": [ "ppc64" ], @@ -1958,13 +1975,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", "cpu": [ "riscv64" ], @@ -1975,13 +1992,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", "cpu": [ "s390x" ], @@ -1992,13 +2009,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", "cpu": [ "x64" ], @@ -2009,13 +2026,30 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", "cpu": [ "x64" ], @@ -2026,13 +2060,30 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", "cpu": [ "x64" ], @@ -2043,13 +2094,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", "cpu": [ "x64" ], @@ -2060,13 +2111,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", "cpu": [ "arm64" ], @@ -2077,13 +2128,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", "cpu": [ "ia32" ], @@ -2094,13 +2145,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", "cpu": [ "x64" ], @@ -2111,7 +2162,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -2596,6 +2647,357 @@ "node": ">=14.0.0" } }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", + "integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz", + "integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz", + "integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz", + "integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz", + "integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz", + "integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz", + "integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz", + "integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz", + "integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz", + "integrity": "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz", + "integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz", + "integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz", + "integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz", + "integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz", + "integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz", + "integrity": "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz", + "integrity": "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz", + "integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz", + "integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", + "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -2662,9 +3064,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true, "license": "MIT" }, @@ -2690,6 +3092,8 @@ "integrity": "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -2726,14 +3130,11 @@ } }, "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "license": "MIT" }, "node_modules/@types/trusted-types": { "version": "2.0.7", @@ -3171,19 +3572,6 @@ "concat-map": "0.0.1" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/browserslist": { "version": "4.24.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", @@ -3224,19 +3612,6 @@ "dev": true, "license": "MIT" }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -3470,6 +3845,15 @@ "node": ">=10" } }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/cross-fetch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", @@ -3931,9 +4315,9 @@ } }, "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3941,31 +4325,34 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" } }, "node_modules/escalade": { @@ -4430,9 +4817,9 @@ } }, "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, @@ -4459,36 +4846,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4530,6 +4887,21 @@ "reusify": "^1.0.4" } }, + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -4576,19 +4948,6 @@ "node": ">=10" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -5441,16 +5800,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-number-object": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", @@ -5716,21 +6065,6 @@ "node": ">=10" } }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "node_modules/js-base64": { "version": "3.7.7", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", @@ -6124,23 +6458,6 @@ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "license": "MIT" }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/micromark": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", @@ -6161,20 +6478,6 @@ "parse-entities": "^2.0.0" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -6557,13 +6860,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -7082,19 +7385,42 @@ } }, "node_modules/rollup": { - "version": "3.29.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", - "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", + "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", "dev": true, "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.41.0", + "@rollup/rollup-android-arm64": "4.41.0", + "@rollup/rollup-darwin-arm64": "4.41.0", + "@rollup/rollup-darwin-x64": "4.41.0", + "@rollup/rollup-freebsd-arm64": "4.41.0", + "@rollup/rollup-freebsd-x64": "4.41.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", + "@rollup/rollup-linux-arm-musleabihf": "4.41.0", + "@rollup/rollup-linux-arm64-gnu": "4.41.0", + "@rollup/rollup-linux-arm64-musl": "4.41.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-musl": "4.41.0", + "@rollup/rollup-linux-s390x-gnu": "4.41.0", + "@rollup/rollup-linux-x64-gnu": "4.41.0", + "@rollup/rollup-linux-x64-musl": "4.41.0", + "@rollup/rollup-win32-arm64-msvc": "4.41.0", + "@rollup/rollup-win32-ia32-msvc": "4.41.0", + "@rollup/rollup-win32-x64-msvc": "4.41.0", "fsevents": "~2.3.2" } }, @@ -7215,9 +7541,9 @@ } }, "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -7372,6 +7698,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -7765,17 +8098,21 @@ "node": ">=8" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "dev": true, "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "fdir": "^6.4.4", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=8.0" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/tr46": { @@ -7948,7 +8285,9 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", @@ -8195,41 +8534,51 @@ } }, "node_modules/vite": { - "version": "4.5.14", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz", - "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -8239,6 +8588,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -8247,29 +8599,44 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, "node_modules/vite-plugin-pwa": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.15.2.tgz", - "integrity": "sha512-l1srtaad5NMNrAtAuub6ArTYG5Ci9AwofXXQ6IsbpCMYQ/0HUndwI7RB2x95+1UBFm7VGttQtT7woBlVnNhBRw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.0.0.tgz", + "integrity": "sha512-X77jo0AOd5OcxmWj3WnVti8n7Kw2tBgV1c8MCXFclrSlDV23ePzv2eTDIALXI2Qo6nJ5pZJeZAuX0AawvRfoeA==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.4", - "fast-glob": "^3.2.12", - "pretty-bytes": "^6.0.0", - "workbox-build": "^6.5.4", - "workbox-window": "^6.5.4" + "debug": "^4.3.6", + "pretty-bytes": "^6.1.1", + "tinyglobby": "^0.2.10", + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" + }, + "engines": { + "node": ">=16.0.0" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "vite": "^3.1.0 || ^4.0.0", - "workbox-build": "^6.5.4", - "workbox-window": "^6.5.4" + "@vite-pwa/assets-generator": "^1.0.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" + }, + "peerDependenciesMeta": { + "@vite-pwa/assets-generator": { + "optional": true + } } }, "node_modules/void-elements": { @@ -8423,40 +8790,41 @@ } }, "node_modules/workbox-background-sync": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", - "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", + "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", "dev": true, "license": "MIT", "dependencies": { "idb": "^7.0.1", - "workbox-core": "6.6.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-broadcast-update": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", - "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", + "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-build": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", - "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.3.0.tgz", + "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", "dev": true, "license": "MIT", "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", + "@babel/core": "^7.24.4", "@babel/preset-env": "^7.11.0", "@babel/runtime": "^7.11.2", "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", "@surma/rollup-plugin-off-main-thread": "^2.2.3", "ajv": "^8.6.0", "common-tags": "^1.8.0", @@ -8466,30 +8834,29 @@ "lodash": "^4.17.20", "pretty-bytes": "^5.3.0", "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", "source-map": "^0.8.0-beta.0", "stringify-object": "^3.3.0", "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", - "workbox-background-sync": "6.6.0", - "workbox-broadcast-update": "6.6.0", - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-google-analytics": "6.6.0", - "workbox-navigation-preload": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-range-requests": "6.6.0", - "workbox-recipes": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0", - "workbox-streams": "6.6.0", - "workbox-sw": "6.6.0", - "workbox-window": "6.6.0" + "workbox-background-sync": "7.3.0", + "workbox-broadcast-update": "7.3.0", + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-google-analytics": "7.3.0", + "workbox-navigation-preload": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-range-requests": "7.3.0", + "workbox-recipes": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0", + "workbox-streams": "7.3.0", + "workbox-sw": "7.3.0", + "workbox-window": "7.3.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=16.0.0" } }, "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { @@ -8534,27 +8901,6 @@ } } }, - "node_modules/workbox-build/node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", @@ -8587,6 +8933,13 @@ "rollup": "^1.20.0||^2.0.0" } }, + "node_modules/workbox-build/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true, + "license": "MIT" + }, "node_modules/workbox-build/node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -8604,6 +8957,13 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/workbox-build/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true, + "license": "MIT" + }, "node_modules/workbox-build/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -8611,6 +8971,19 @@ "dev": true, "license": "MIT" }, + "node_modules/workbox-build/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/workbox-build/node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -8640,23 +9013,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/workbox-build/node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", @@ -8700,142 +9056,140 @@ } }, "node_modules/workbox-cacheable-response": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", - "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", - "deprecated": "workbox-background-sync@6.6.0", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", + "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", - "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.3.0.tgz", + "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==", "dev": true, "license": "MIT" }, "node_modules/workbox-expiration": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", - "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.3.0.tgz", + "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", "dev": true, "license": "MIT", "dependencies": { "idb": "^7.0.1", - "workbox-core": "6.6.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-google-analytics": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", - "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", - "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", + "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-background-sync": "6.6.0", - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" + "workbox-background-sync": "7.3.0", + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, "node_modules/workbox-navigation-preload": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", - "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", + "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-precaching": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", - "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz", + "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, "node_modules/workbox-range-requests": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", - "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", + "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-recipes": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", - "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.3.0.tgz", + "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, "node_modules/workbox-routing": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", - "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.3.0.tgz", + "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-strategies": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", - "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.3.0.tgz", + "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.0" + "workbox-core": "7.3.0" } }, "node_modules/workbox-streams": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", - "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.3.0.tgz", + "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", "dev": true, "license": "MIT", "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0" + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0" } }, "node_modules/workbox-sw": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", - "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz", + "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==", "dev": true, "license": "MIT" }, "node_modules/workbox-window": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", - "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz", + "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", "dev": true, "license": "MIT", "dependencies": { "@types/trusted-types": "^2.0.2", - "workbox-core": "6.6.0" + "workbox-core": "7.3.0" } }, "node_modules/wrappy": { @@ -8862,12 +9216,18 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 6" + "node": ">= 14.6" } }, "node_modules/yocto-queue": { diff --git a/web/package.json b/web/package.json index bb84ff16..0de56abd 100644 --- a/web/package.json +++ b/web/package.json @@ -44,8 +44,8 @@ "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "prettier": "^2.8.8", - "vite": "^4.3.9", - "vite-plugin-pwa": "^0.15.0" + "vite": "^6.3.5", + "vite-plugin-pwa": "^1.0.0" }, "browserslist": { "production": [ From 7067d8aa771228030ef01246556176f9590d947b Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Wed, 21 May 2025 20:55:54 -0400 Subject: [PATCH 042/117] Release notes --- cmd/webpush.go | 12 ++++++------ docs/integrations.md | 6 +++--- docs/releases.md | 18 +++++++++++++++--- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/cmd/webpush.go b/cmd/webpush.go index bd44f5aa..a5f66e60 100644 --- a/cmd/webpush.go +++ b/cmd/webpush.go @@ -11,9 +11,9 @@ import ( "github.com/urfave/cli/v2/altsrc" ) -var flagsWebpush = append( +var flagsWebPush = append( []cli.Flag{}, - altsrc.NewStringFlag(&cli.StringFlag{Name: "key-file", Aliases: []string{"f"}, Usage: "write vapid keys to this file"}), + altsrc.NewStringFlag(&cli.StringFlag{Name: "output-file", Aliases: []string{"f"}, Usage: "write VAPID keys to this file"}), ) func init() { @@ -33,7 +33,7 @@ var cmdWebPush = &cli.Command{ Usage: "Generate VAPID keys to enable browser background push notifications", UsageText: "ntfy webpush keys", Category: categoryServer, - Flags: flagsWebpush, + Flags: flagsWebPush, }, }, } @@ -44,16 +44,16 @@ func generateWebPushKeys(c *cli.Context) error { return err } - if keyFile := c.String("key-file"); keyFile != "" { + if outputFIle := c.String("output-file"); outputFIle != "" { contents := fmt.Sprintf(`--- web-push-public-key: %s web-push-private-key: %s `, publicKey, privateKey) - err = os.WriteFile(keyFile, []byte(contents), 0660) + err = os.WriteFile(outputFIle, []byte(contents), 0660) if err != nil { return err } - _, err = fmt.Fprintf(c.App.ErrWriter, `Web Push keys written to %s.`, keyFile) + _, err = fmt.Fprintf(c.App.ErrWriter, `Web Push keys written to %s.`, outputFIle) } else { _, err = fmt.Fprintf(c.App.ErrWriter, `Web Push keys generated. Add the following lines to your config file: diff --git a/docs/integrations.md b/docs/integrations.md index ad84cb48..2dc210d4 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -9,9 +9,9 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [Integration via HTTP/SMTP/etc.](#integration-via-httpsmtpetc) - [UnifiedPush integrations](#unifiedpush-integrations) - [Libraries](#libraries) -- [CLIs + GUIs](#clis--guis) -- [Projects + scripts](#projects--scripts) -- [Blog + forum posts](#blog--forum-posts) +- [CLIs + GUIs](#clis-guis) +- [Projects + scripts](#projects-scripts) +- [Blog + forum posts](#blog-forum-posts) - [Alternative ntfy servers](#alternative-ntfy-servers) ## Official integrations diff --git a/docs/releases.md b/docs/releases.md index 65af14d5..03bdd1d0 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1377,19 +1377,31 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Features:** -* Add username/password auth to email publishing ([#1164](https://github.com/binwiederhier/ntfy/pull/1164), thanks to [@bishtawi](https://github.com/bishtawi)) +* Add username/password auth to email publishing ([#1164](https://github.com/binwiederhier/ntfy/pull/1164), thanks to [@bishtawi](https://github.com/bishtawi) for implementing) +* Write VAPID keys to file in `ntfy webpush --output-file` ([#1138](https://github.com/binwiederhier/ntfy/pull/1138), thanks to [@nogweii](https://github.com/nogweii) for implementing) **Bug fixes + maintenance:** -* Add `Date` header to outgoing emails to avoid rejection ([#1141](https://github.com/binwiederhier/ntfy/pull/1141), thanks to [@pcouy](https://github.com/pcouy)) * Security updates for dependencies and Docker images ([#1341](https://github.com/binwiederhier/ntfy/pull/1341)) +* Add `Date` header to outgoing emails to avoid rejection ([#1141](https://github.com/binwiederhier/ntfy/pull/1141), thanks to [@pcouy](https://github.com/pcouy)) * Fix IP address parsing when behind a proxy ([#1266](https://github.com/binwiederhier/ntfy/pull/1266), thanks to [@mmatuska](https://github.com/mmatuska)) * Make sure UnifiedPush messages are not treated as attachments ([#1312](https://github.com/binwiederhier/ntfy/pull/1312), thanks to [@vkrause](https://github.com/vkrause)) * Add OCI image version to Docker image ([#1307](https://github.com/binwiederhier/ntfy/pull/1307), thanks to [@jlssmt](https://github.com/jlssmt)) +* WebSocket returning incorrect HTTP error code ([#1338](https://github.com/binwiederhier/ntfy/pull/1338) / [#1337](https://github.com/binwiederhier/ntfy/pull/1337), thanks to [@wunter8](https://github.com/wunter8) for debugging and implementing) **Documentation:** -* Lots of new integrations: [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp), [UptimeObserver](https://uptimeobserver.com), [alertmanager-ntfy-relay](https://github.com/therobbielee/alertmanager-ntfy-relay), [Monibot](https://monibot.io/), ... Amazing! +* Lots of new integrations and projects. Amazing! + * [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) + * [UptimeObserver](https://uptimeobserver.com) + * [alertmanager-ntfy-relay](https://github.com/therobbielee/alertmanager-ntfy-relay) + * [Monibot](https://monibot.io/) + * [Daily_Fact_Ntfy](https://github.com/thiswillbeyourgithub/Daily_Fact_Ntfy) + * [EasyMorph](https://help.easymorph.com/doku.php?id=transformations:sendntfymessage) + * [ntfy-run](https://github.com/quantum5/ntfy-run) + * [Clipboard IO](https://github.com/jim3692/clipboard-io) + * [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) + * [InvaderInformant](https://github.com/patricksthannon/InvaderInformant) * Various docs updates ([#1161](https://github.com/binwiederhier/ntfy/pull/1161), thanks to [@OneWeekNotice](https://github.com/OneWeekNotice)) * Typo in config docs ([#1177](https://github.com/binwiederhier/ntfy/pull/1177), thanks to [@hoho4190](https://github.com/hoho4190)) * Typo in CLI docs ([#1172](https://github.com/binwiederhier/ntfy/pull/1172), thanks to [@anirvan](https://github.com/anirvan)) From e64a0bd8c99b8b05ab80081208c633501d219d82 Mon Sep 17 00:00:00 2001 From: Patrick Morris <31410292+ptmorris1@users.noreply.github.com> Date: Thu, 22 May 2025 13:37:54 -0500 Subject: [PATCH 043/117] Add NtfyPwsh integration and blog --- docs/integrations.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/integrations.md b/docs/integrations.md index 2dc210d4..1c14ab95 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -166,6 +166,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [Clipboard IO](https://github.com/jim3692/clipboard-io) - End to end encrypted clipboard - [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) - An ntfy MCP server for sending/fetching ntfy notifications to your self-hosted ntfy server from AI Agents (supports secure token auth & more - use with npx or docker!) (Node/Typescript) - [InvaderInformant](https://github.com/patricksthannon/InvaderInformant) - Script for Mac OS systems that monitors new or dropped connections to your network using ntfy (Shell) +- [NtfyPwsh](https://github.com/ptmorris1/NtfyPwsh) - PowerShell module to help send messages to ntfy (PowerShell) ## Blog + forum posts @@ -267,6 +268,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [Show HN: A tool to send push notifications to your phone, written in Go](https://news.ycombinator.com/item?id=29715464) ⭐ - news.ycombinator.com - 12/2021 - [Reddit selfhostable post](https://www.reddit.com/r/selfhosted/comments/qxlsm9/my_open_source_notification_android_app_and/) ⭐ - reddit.com - 11/2021 - [ntfy on The Canary in the Cage Podcast](https://odysee.com/@TheCanaryInTheCage:b/The-Canary-in-the-Cage-Episode-42:1?r=4gitYjTacQqPEjf22874USecDQYJ5y5E&t=3062) - odysee.com - 1/2025 +- [NtfyPwsh - A PowerShell Module to Send Ntfy Messages](https://ptmorris1.github.io/posts/NtfyPwsh/) - github.io - 5/2025 ## Alternative ntfy servers From ad3e7960ce67b3cb963ebfc015fc91ec996c2ed3 Mon Sep 17 00:00:00 2001 From: tr4nt0r <4445816+tr4nt0r@users.noreply.github.com> Date: Fri, 23 May 2025 01:31:16 +0200 Subject: [PATCH 044/117] Add official Home Assistant integration and async python library --- docs/integrations.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/integrations.md b/docs/integrations.md index 1c14ab95..52f75f22 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -5,6 +5,7 @@ There are quite a few projects that work with ntfy, integrate ntfy, or have been I've added a ⭐ to projects or posts that have a significant following, or had a lot of interaction by the community. ## Table of Contents + - [Official integrations](#official-integrations) - [Integration via HTTP/SMTP/etc.](#integration-via-httpsmtpetc) - [UnifiedPush integrations](#unifiedpush-integrations) @@ -38,6 +39,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [HetrixTools](https://docs.hetrixtools.com/ntfy-sh-notifications/) - Uptime monitoring - [EasyMorph](https://help.easymorph.com/doku.php?id=transformations:sendntfymessage) - Visual data transformation and automation tool - [Monibot](https://monibot.io/) - Monibot monitors your websites, servers and applications and notifies you if something goes wrong. +- [Home Assistant](https://www.home-assistant.io/integrations/ntfy) - Home Assistant is an open-source platform for automating and controlling smart home devices. ## Integration via HTTP/SMTP/etc. @@ -76,6 +78,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [gotfy](https://github.com/AnthonyHewins/gotfy) - A Go wrapper for the ntfy API (Go) - [symfony/ntfy-notifier](https://symfony.com/components/NtfyNotifier) ⭐ - Symfony Notifier integration for ntfy (PHP) - [ntfy-java](https://github.com/MaheshBabu11/ntfy-java/) - A Java package to interact with a ntfy server (Java) +- [aiontfy](https://github.com/tr4nt0r/aiontfy) - Asynchronous client library for publishing and subscribing to ntfy (Python) ## CLIs + GUIs From 6d15b9face0f6dcc98ff2d0dfe95b47700139454 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 22 May 2025 20:48:24 -0400 Subject: [PATCH 045/117] Fix up APNs PR --- cmd/webpush_test.go | 2 +- docs/integrations.md | 2 +- docs/releases.md | 2 ++ server/server_firebase.go | 58 +++++++++++++++++---------------------- 4 files changed, 29 insertions(+), 35 deletions(-) diff --git a/cmd/webpush_test.go b/cmd/webpush_test.go index c2f19f6f..01e1a7a1 100644 --- a/cmd/webpush_test.go +++ b/cmd/webpush_test.go @@ -16,7 +16,7 @@ func TestCLI_WebPush_GenerateKeys(t *testing.T) { func TestCLI_WebPush_WriteKeysToFile(t *testing.T) { app, _, _, stderr := newTestApp() - require.Nil(t, runWebPushCommand(app, server.NewConfig(), "keys", "--key-file=key-file.yaml")) + require.Nil(t, runWebPushCommand(app, server.NewConfig(), "keys", "--output-file=key-file.yaml")) require.Contains(t, stderr.String(), "Web Push keys written to key-file.yaml") require.FileExists(t, "key-file.yaml") } diff --git a/docs/integrations.md b/docs/integrations.md index 52f75f22..5e550b53 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -18,6 +18,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had ## Official integrations - [changedetection.io](https://changedetection.io) ⭐ - Website change detection and notification +- [Home Assistant](https://www.home-assistant.io/integrations/ntfy) ⭐ - Home Assistant is an open-source platform for automating and controlling smart home devices. - [Healthchecks.io](https://healthchecks.io/) ⭐ - Online service for monitoring regularly running tasks such as cron jobs - [Apprise](https://github.com/caronc/apprise/wiki/Notify_ntfy) ⭐ - Push notifications that work with just about every platform - [Uptime Kuma](https://uptime.kuma.pet/) ⭐ - A self-hosted monitoring tool @@ -39,7 +40,6 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [HetrixTools](https://docs.hetrixtools.com/ntfy-sh-notifications/) - Uptime monitoring - [EasyMorph](https://help.easymorph.com/doku.php?id=transformations:sendntfymessage) - Visual data transformation and automation tool - [Monibot](https://monibot.io/) - Monibot monitors your websites, servers and applications and notifies you if something goes wrong. -- [Home Assistant](https://www.home-assistant.io/integrations/ntfy) - Home Assistant is an open-source platform for automating and controlling smart home devices. ## Integration via HTTP/SMTP/etc. diff --git a/docs/releases.md b/docs/releases.md index 03bdd1d0..dee81727 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1383,11 +1383,13 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** * Security updates for dependencies and Docker images ([#1341](https://github.com/binwiederhier/ntfy/pull/1341)) +* Fix iOS delivery issues for read-protected topics ([#1207](https://github.com/binwiederhier/ntfy/pull/1287), thanks a lot to [@barart](https://github.com/barart)!) * Add `Date` header to outgoing emails to avoid rejection ([#1141](https://github.com/binwiederhier/ntfy/pull/1141), thanks to [@pcouy](https://github.com/pcouy)) * Fix IP address parsing when behind a proxy ([#1266](https://github.com/binwiederhier/ntfy/pull/1266), thanks to [@mmatuska](https://github.com/mmatuska)) * Make sure UnifiedPush messages are not treated as attachments ([#1312](https://github.com/binwiederhier/ntfy/pull/1312), thanks to [@vkrause](https://github.com/vkrause)) * Add OCI image version to Docker image ([#1307](https://github.com/binwiederhier/ntfy/pull/1307), thanks to [@jlssmt](https://github.com/jlssmt)) * WebSocket returning incorrect HTTP error code ([#1338](https://github.com/binwiederhier/ntfy/pull/1338) / [#1337](https://github.com/binwiederhier/ntfy/pull/1337), thanks to [@wunter8](https://github.com/wunter8) for debugging and implementing) +* Make Markdown in web app scrollable horizontally ([#1262](https://github.com/binwiederhier/ntfy/pull/1262), thanks to [@rake5k](https://github.com/rake5k) for fixing) **Documentation:** diff --git a/server/server_firebase.go b/server/server_firebase.go index aff96db7..2b01add2 100644 --- a/server/server_firebase.go +++ b/server/server_firebase.go @@ -50,7 +50,7 @@ func (c *firebaseClient) Send(v *visitor, m *message) error { ev.Field("firebase_message", util.MaybeMarshalJSON(fbm)).Trace("Firebase message") } err = c.sender.Send(fbm) - if err == errFirebaseQuotaExceeded { + if errors.Is(err, errFirebaseQuotaExceeded) { logvm(v, m). Tag(tagFirebase). Err(err). @@ -133,7 +133,7 @@ func toFirebaseMessage(m *message, auther user.Auther) (*messaging.Message, erro "time": fmt.Sprintf("%d", m.Time), "event": m.Event, "topic": m.Topic, - "message": m.Message, + "message": newMessageBody, "poll_id": m.PollID, } apnsConfig = createAPNSAlertConfig(m, data) @@ -173,28 +173,29 @@ func toFirebaseMessage(m *message, auther user.Auther) (*messaging.Message, erro } apnsConfig = createAPNSAlertConfig(m, data) } else { - // If anonymous read for a topic is not allowed, we cannot send the message along + // If "anonymous read" for a topic is not allowed, we cannot send the message along // via Firebase. Instead, we send a "poll_request" message, asking the client to poll. - //App function needs all the data to create a message object, if not, it fails, - //so we set it but put a placeholders to not to send the actual message - //but generic title and message instead, we also add the poll_id so client knowns - //what message is goint to "decode" (retrieve) + // + // The data map needs to contain all the fields for it to function properly. If not all + // fields are set, the iOS app fails to decode the message. + // + // See https://github.com/binwiederhier/ntfy/pull/1345 data = map[string]string{ - "id": m.ID, - "time": fmt.Sprintf("%d", m.Time), - "event": pollRequestEvent, - "topic": m.Topic, - "priority": fmt.Sprintf("%d", m.Priority), - "tags": strings.Join(m.Tags, ","), - "click": m.Click, - "icon": m.Icon, - "title": "Private", - "message": "Message", - "content_type": m.ContentType, - "encoding": m.Encoding, - "poll_id": m.ID, - } - apnsConfig = createAPNSAlertConfig(m, data) + "id": m.ID, + "time": fmt.Sprintf("%d", m.Time), + "event": pollRequestEvent, + "topic": m.Topic, + "priority": fmt.Sprintf("%d", m.Priority), + "tags": "", + "click": "", + "icon": "", + "title": "", + "message": newMessageBody, + "content_type": m.ContentType, + "encoding": m.Encoding, + "poll_id": m.ID, + } + apnsConfig = createAPNSAlertConfig(m, data) } } var androidConfig *messaging.AndroidConfig @@ -238,23 +239,14 @@ func createAPNSAlertConfig(m *message, data map[string]string) *messaging.APNSCo for k, v := range data { apnsData[k] = v } - alertTitle := m.Title - alertBody := maybeTruncateAPNSBodyMessage(m.Message) - // If the event is pollRequestEvent (server/topic is restricted) we dont want to - //send the actual message to Firebase/APNS, so we send a generic text - //if for some reason, client cant retrieve the message, it shows this as the message and title - if event, ok := data["event"]; ok && event == pollRequestEvent { - alertTitle = "New Notification received" - alertBody = "Message cant be retrieved, open the app and refresh content" - } return &messaging.APNSConfig{ Payload: &messaging.APNSPayload{ CustomData: apnsData, Aps: &messaging.Aps{ MutableContent: true, Alert: &messaging.ApsAlert{ - Title: alertTitle, - Body: alertBody, + Title: m.Title, + Body: maybeTruncateAPNSBodyMessage(m.Message), }, }, }, From 1598087e1fae9aed9d2d3473237e55766c2b27c5 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 22 May 2025 20:58:28 -0400 Subject: [PATCH 046/117] Fix tests --- docs/releases.md | 3 ++- server/server_firebase_test.go | 21 +++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index dee81727..877cd674 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1379,6 +1379,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Add username/password auth to email publishing ([#1164](https://github.com/binwiederhier/ntfy/pull/1164), thanks to [@bishtawi](https://github.com/bishtawi) for implementing) * Write VAPID keys to file in `ntfy webpush --output-file` ([#1138](https://github.com/binwiederhier/ntfy/pull/1138), thanks to [@nogweii](https://github.com/nogweii) for implementing) +* Add Docker major/minor version to image tags ([#1271](https://github.com/binwiederhier/ntfy/pull/1271), thanks to [@RoboMagus](https://github.com/RoboMagus)) **Bug fixes + maintenance:** @@ -1389,7 +1390,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Make sure UnifiedPush messages are not treated as attachments ([#1312](https://github.com/binwiederhier/ntfy/pull/1312), thanks to [@vkrause](https://github.com/vkrause)) * Add OCI image version to Docker image ([#1307](https://github.com/binwiederhier/ntfy/pull/1307), thanks to [@jlssmt](https://github.com/jlssmt)) * WebSocket returning incorrect HTTP error code ([#1338](https://github.com/binwiederhier/ntfy/pull/1338) / [#1337](https://github.com/binwiederhier/ntfy/pull/1337), thanks to [@wunter8](https://github.com/wunter8) for debugging and implementing) -* Make Markdown in web app scrollable horizontally ([#1262](https://github.com/binwiederhier/ntfy/pull/1262), thanks to [@rake5k](https://github.com/rake5k) for fixing) +* Make Markdown in the web app scrollable horizontally ([#1262](https://github.com/binwiederhier/ntfy/pull/1262), thanks to [@rake5k](https://github.com/rake5k) for fixing) **Documentation:** diff --git a/server/server_firebase_test.go b/server/server_firebase_test.go index 9b653a29..8d88fcf0 100644 --- a/server/server_firebase_test.go +++ b/server/server_firebase_test.go @@ -223,13 +223,22 @@ func TestToFirebaseMessage_Message_Normal_Not_Allowed(t *testing.T) { require.Equal(t, &messaging.AndroidConfig{ Priority: "high", }, fbm.Android) - require.Equal(t, "", fbm.Data["message"]) - require.Equal(t, "", fbm.Data["priority"]) + require.Equal(t, "New message", fbm.Data["message"]) + require.Equal(t, "5", fbm.Data["priority"]) require.Equal(t, map[string]string{ - "id": m.ID, - "time": fmt.Sprintf("%d", m.Time), - "event": "poll_request", - "topic": "mytopic", + "id": m.ID, + "time": fmt.Sprintf("%d", m.Time), + "event": "poll_request", + "topic": "mytopic", + "message": "New message", + "title": "", + "tags": "", + "click": "", + "icon": "", + "priority": "5", + "encoding": "", + "content_type": "", + "poll_id": m.ID, }, fbm.Data) } From f595dff66f0b3b00c5f2c5e798888122f58a662b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m?= Date: Tue, 30 Jul 2024 05:02:41 +0000 Subject: [PATCH 047/117] Translated using Weblate (Galician) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/gl/ --- web/public/static/langs/gl.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/web/public/static/langs/gl.json b/web/public/static/langs/gl.json index a7666a19..bb4715f6 100644 --- a/web/public/static/langs/gl.json +++ b/web/public/static/langs/gl.json @@ -62,7 +62,7 @@ "notifications_none_for_topic_title": "Aínda non recibiches ningunha notificación para este tema.", "reserve_dialog_checkbox_label": "Reservar tema e configurar acceso", "notifications_loading": "Cargando notificacións…", - "publish_dialog_base_url_placeholder": "URL de servizo, ex. https://exemplo.com", + "publish_dialog_base_url_placeholder": "URL do servizo, ex. https://exemplo.com", "publish_dialog_topic_label": "Nome do tema", "publish_dialog_topic_placeholder": "Nome do tema, ex. alertas_equipo", "publish_dialog_topic_reset": "Restablecer tema", @@ -315,17 +315,17 @@ "account_basics_password_dialog_current_password_incorrect": "Contrasinal incorrecto", "account_basics_phone_numbers_dialog_number_label": "Número de teléfono", "account_basics_password_dialog_button_submit": "Modificar contrasinal", - "account_basics_username_title": "Usuario", + "account_basics_username_title": "Identificador", "account_basics_phone_numbers_dialog_check_verification_button": "Código de confirmación", "account_usage_messages_title": "Mesaxes publicados", "account_basics_phone_numbers_dialog_verify_button_sms": "Enviar SMS", "account_basics_tier_change_button": "Cambiar", "account_basics_phone_numbers_dialog_description": "Para usar a característica de chamadas de teléfono, vostede debe engadir e verificar ao menos un número de teléfono. A verificación pode ser realizada vía SMS ou a través de chamada.", - "account_delete_title": "Borrar conta", + "account_delete_title": "Eliminar a conta", "account_delete_dialog_label": "Contrasinal", "account_basics_tier_admin_suffix_with_tier": "(con tier {{tier}})", - "subscribe_dialog_login_username_label": "Nome de usuario, ex. phil", - "subscribe_dialog_error_user_not_authorized": "Usuario {{username}} non autorizado", + "subscribe_dialog_login_username_label": "Identificador, ex. xoana", + "subscribe_dialog_error_user_not_authorized": "Identificador {{username}} non autorizado", "account_basics_title": "Conta", "account_basics_phone_numbers_no_phone_numbers_yet": "Aínda non hay números de teléfono", "subscribe_dialog_subscribe_button_generate_topic_name": "Xerar nome", @@ -333,9 +333,9 @@ "subscribe_dialog_subscribe_button_subscribe": "Subscribirse", "account_basics_phone_numbers_dialog_title": "Engadir número de teléfono", "account_basics_username_admin_tooltip": "É vostede Admin", - "account_delete_dialog_description": "Isto borrará permanentemente a túa conta, incluido todos os datos almacenados no servidor. Despois do borrado, o teu nome de usuario non estará dispoñible durante 7 días. Se realmente queres proceder, por favor confirme co seu contrasinal na caixa inferior.", + "account_delete_dialog_description": "Isto borrará permanentemente a conta, incluido todos os datos almacenados no servidor. Despois do borrado, o teu identificador non estará dispoñible durante 7 días. Se realmente queres proceder, por favor confirma co contrasinal na caixa inferior.", "account_usage_reservations_none": "Non hai temas reservados para esta conta", - "subscribe_dialog_subscribe_topic_placeholder": "Nome do tema, ex. phil_alertas", + "subscribe_dialog_subscribe_topic_placeholder": "Nome do tema, ex. alertas_xoana", "account_usage_title": "Uso", "account_basics_tier_upgrade_button": "Mexorar a Pro", "subscribe_dialog_error_topic_already_reserved": "Tema xa reservado", @@ -351,11 +351,11 @@ "account_basics_phone_numbers_copied_to_clipboard": "Número de teléfono copiado no portapapeis", "account_basics_tier_title": "Tipo de conta", "account_usage_cannot_create_portal_session": "Non foi posible abrir o portal de pagos", - "account_delete_description": "Borrar permanentemente a túa conta", + "account_delete_description": "Eliminar a conta de xeito definitivo", "account_basics_phone_numbers_dialog_number_placeholder": "ex. +1222333444", "account_basics_phone_numbers_dialog_code_placeholder": "ex. 123456", "account_basics_tier_manage_billing_button": "Xestionar pagos", - "account_basics_username_description": "Ei, ese eres ti ❤", + "account_basics_username_description": "Ei, es ti ❤", "account_basics_password_dialog_confirm_password_label": "Confirmar contrasinal", "account_basics_tier_interval_yearly": "anual", "account_delete_dialog_button_submit": "Borrar permanentemente a conta", @@ -364,7 +364,7 @@ "account_basics_password_dialog_new_password_label": "Novo contrasinal", "account_usage_of_limit": "de {{limit}}", "subscribe_dialog_error_user_anonymous": "anónimo", - "account_usage_basis_ip_description": "Estadísticas de uso e límites para esta conta están basados na sua IP, polo que poden estar compartidos con outros usuarios. Os limites mostrados son aproximados, basados nos ratios de limite existentes.", + "account_usage_basis_ip_description": "As estatísticas de uso e límites para esta conta están basados na IP, polo que poden estar compartidas con outras usuarias. Os limites mostrados son aproximados, baseados nos límites das taxas existentes.", "account_basics_password_dialog_title": "Modificar contrasinal", "account_usage_limits_reset_daily": "Límite de uso é reiniciado diariamente a medianoite (UTC(", "account_usage_unlimited": "Sen límites", @@ -380,7 +380,7 @@ "account_basics_phone_numbers_dialog_verify_button_call": "Chámame", "account_usage_emails_title": "Emails enviados", "account_basics_phone_numbers_dialog_channel_sms": "SMS", - "subscribe_dialog_login_description": "Este tema está protexido por contrasinal. Por favor, introduza o usuario e contrasinal para subscribirse.", + "subscribe_dialog_login_description": "Este tema está protexido por contrasinal. Por favor, escribe as credenciais para subscribirte.", "action_bar_mute_notifications": "Acalar notificacións", "action_bar_unmute_notifications": "Reactivar notificacións", "alert_notification_permission_required_title": "Notificacións desactivadas", From dc6b8ece1e818f90869232b3d6341eaa9fd9b4c0 Mon Sep 17 00:00:00 2001 From: Stefano Maggi Date: Sat, 3 Aug 2024 22:18:57 +0000 Subject: [PATCH 048/117] Translated using Weblate (Italian) Currently translated at 87.6% (355 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/it/ --- web/public/static/langs/it.json | 38 ++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/it.json b/web/public/static/langs/it.json index 7ddd60fc..6605d4dd 100644 --- a/web/public/static/langs/it.json +++ b/web/public/static/langs/it.json @@ -316,5 +316,41 @@ "action_bar_unmute_notifications": "Riattiva audio notifiche", "alert_notification_ios_install_required_title": "E' richiesta l'installazione di iOS", "alert_notification_ios_install_required_description": "Fare clic sull'icona Condividi e Aggiungi alla schermata home per abilitare le notifiche su iOS", - "publish_dialog_checkbox_markdown": "Formatta come markdown" + "publish_dialog_checkbox_markdown": "Formatta come markdown", + "account_upgrade_dialog_interval_yearly": "Annualmente", + "account_tokens_table_token_header": "Token", + "account_tokens_table_label_header": "Etichetta", + "account_tokens_table_cannot_delete_or_edit": "Impossibile modificare o eliminare il token della sessione corrente", + "account_tokens_dialog_label": "Etichetta, ad esempio Notifiche Radarr", + "account_tokens_dialog_title_delete": "Elimina token di accesso", + "account_tokens_dialog_title_edit": "Modifica token di accesso", + "account_tokens_dialog_button_create": "Crea token", + "account_tokens_dialog_button_update": "Aggiorna token", + "account_upgrade_dialog_tier_features_emails_one": "{{emails}} e-mails giornaliere", + "account_upgrade_dialog_tier_features_messages_other": "{{messages}} messaggi giornalieri", + "account_upgrade_dialog_tier_features_attachment_file_size": "{{filesize}} per file", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} spazio di archiviazione totale", + "notifications_actions_failed_notification": "Azione non riuscita", + "account_usage_attachment_storage_description": "{{filesize}} per file, eliminato dopo {{expiry}}", + "account_upgrade_dialog_title": "Cambia livello account", + "account_upgrade_dialog_interval_monthly": "Mensilmente", + "account_upgrade_dialog_cancel_warning": "Questa azione annullerà il tuo abbonamento e declasserà il tuo account il {{date}}. In quella data, le prenotazioni degli argomenti e i messaggi memorizzati nella cache del server verranno eliminati.", + "account_upgrade_dialog_reservations_warning_other": "Il livello selezionato consente meno argomenti riservati rispetto al livello attuale. Prima di cambiare il livello, elimina almeno {{count}} prenotazioni. Puoi rimuovere le prenotazioni nelle Impostazioni.", + "account_upgrade_dialog_tier_features_reservations_other": "{{reservations}} argomenti riservati", + "account_upgrade_dialog_tier_features_emails_other": "{{emails}} e-mail giornaliere", + "account_upgrade_dialog_tier_features_calls_one": "{{calls}} telefonate giornaliere", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} telefonate giornaliere", + "account_upgrade_dialog_tier_features_no_calls": "Nessuna telefonata", + "account_tokens_description": "Utilizza i token di accesso quando pubblichi e ti iscrivi tramite l'API ntfy, così non dovrai inviare le credenziali del tuo account. Consulta la documentazione per saperne di più.", + "account_tokens_table_copied_to_clipboard": "Token di accesso copiato", + "account_tokens_table_create_token_button": "Crea token di accesso", + "account_tokens_table_last_origin_tooltip": "Dall'indirizzo IP {{ip}}, clicca per cercare", + "account_tokens_dialog_title_create": "Crea token di accesso", + "account_tokens_dialog_button_cancel": "Annulla", + "web_push_unknown_notification_body": "Potrebbe essere necessario aggiornare ntfy aprendo l'app web", + "account_upgrade_dialog_proration_info": "Prorata: quando si esegue l'upgrade tra piani a pagamento, la differenza di prezzo verrà addebitata immediatamente. Quando si esegue il downgrade a un livello inferiore, il saldo verrà utilizzato per pagare i periodi di fatturazione futuri.", + "account_tokens_table_last_access_header": "Ultimo accesso", + "account_tokens_table_expires_header": "Scade", + "account_tokens_table_never_expires": "Non scade mai", + "account_tokens_table_current_session": "Sessione corrente del browser" } From 7835fc65c4e36c04ac31594528c99993a8842c84 Mon Sep 17 00:00:00 2001 From: Jakob Malchow Date: Sat, 3 Aug 2024 22:28:10 +0000 Subject: [PATCH 049/117] Translated using Weblate (Italian) Currently translated at 87.6% (355 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/it/ --- web/public/static/langs/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/it.json b/web/public/static/langs/it.json index 6605d4dd..3ce17812 100644 --- a/web/public/static/langs/it.json +++ b/web/public/static/langs/it.json @@ -352,5 +352,6 @@ "account_tokens_table_last_access_header": "Ultimo accesso", "account_tokens_table_expires_header": "Scade", "account_tokens_table_never_expires": "Non scade mai", - "account_tokens_table_current_session": "Sessione corrente del browser" + "account_tokens_table_current_session": "Sessione corrente del browser", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "Risparmia fino al {{discount}}%" } From 94d0c5a3358c00d9c07faa831e1389a120d8f392 Mon Sep 17 00:00:00 2001 From: Stefano Maggi Date: Sat, 3 Aug 2024 22:36:56 +0000 Subject: [PATCH 050/117] Translated using Weblate (Italian) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/it/ --- web/public/static/langs/it.json | 52 ++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/it.json b/web/public/static/langs/it.json index 3ce17812..1ba1eba8 100644 --- a/web/public/static/langs/it.json +++ b/web/public/static/langs/it.json @@ -353,5 +353,55 @@ "account_tokens_table_expires_header": "Scade", "account_tokens_table_never_expires": "Non scade mai", "account_tokens_table_current_session": "Sessione corrente del browser", - "account_upgrade_dialog_interval_yearly_discount_save_up_to": "Risparmia fino al {{discount}}%" + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "Risparmia fino al {{discount}}%", + "account_upgrade_dialog_interval_yearly_discount_save": "conserva {{discount}}%", + "prefs_users_description_no_sync": "Gli utenti e le password non vengono sincronizzati con il tuo account.", + "prefs_reservations_title": "Argomenti riservati", + "prefs_reservations_table_access_header": "Accesso", + "reservation_delete_dialog_action_delete_title": "Elimina i messaggi e gli allegati memorizzati nella cache", + "reservation_delete_dialog_submit_button": "Elimina prenotazione", + "account_tokens_dialog_expires_label": "Il token di accesso scade tra", + "account_tokens_dialog_expires_unchanged": "Lascia la data di scadenza invariata", + "account_tokens_delete_dialog_submit_button": "Elimina definitivamente il token", + "prefs_reservations_description": "Qui puoi riservare i nomi degli argomenti per uso personale. Riservare un argomento ti dà la proprietà dell'argomento e ti consente di definire i permessi di accesso per altri utenti sull'argomento.", + "prefs_reservations_add_button": "Aggiungi argomento riservato", + "prefs_reservations_edit_button": "Modifica accesso argomento", + "prefs_reservations_delete_button": "Reimposta accesso argomento", + "prefs_reservations_table_everyone_read_only": "Posso pubblicare e iscrivermi, tutti possono iscriversi", + "prefs_reservations_table_not_subscribed": "Non iscritto", + "prefs_reservations_table_everyone_write_only": "Posso pubblicare ed iscrivermi, tutti possono pubblicare", + "prefs_reservations_table_everyone_read_write": "Tutti possono pubblicare e iscriversi", + "prefs_reservations_dialog_title_delete": "Elimina prenotazione argomento", + "prefs_reservations_dialog_description": "Prenotando un argomento ne diventi proprietario e puoi definire le autorizzazioni di accesso per altri utenti.", + "reservation_delete_dialog_action_keep_description": "I messaggi e gli allegati memorizzati nella cache del server diventeranno visibili al pubblico per le persone a conoscenza del nome dell'argomento.", + "reservation_delete_dialog_action_delete_description": "I messaggi e gli allegati memorizzati nella cache verranno eliminati definitivamente. Questa azione non può essere annullata.", + "prefs_reservations_limit_reached": "Hai raggiunto il limite di argomenti riservati.", + "prefs_reservations_table_click_to_subscribe": "Clicca per iscriverti", + "prefs_reservations_dialog_title_add": "Prenota argomento", + "prefs_reservations_dialog_title_edit": "Modifica argomento riservato", + "account_tokens_dialog_expires_x_days": "Il token scade tra {{days}} giorni", + "account_tokens_dialog_expires_never": "Il token non scade mai", + "account_tokens_delete_dialog_title": "Elimina token di accesso", + "account_tokens_delete_dialog_description": "Prima di eliminare un token di accesso, assicurati che nessuna applicazione o script lo stia utilizzando attivamente. Questa azione non può essere annullata.", + "prefs_notifications_web_push_title": "Notifiche in background", + "prefs_notifications_web_push_enabled_description": "Le notifiche vengono ricevute anche quando l'app Web non è in esecuzione (tramite Web Push)", + "prefs_notifications_web_push_disabled_description": "Le notifiche vengono ricevute quando l'app Web è in esecuzione (tramite WebSocket)", + "prefs_notifications_web_push_enabled": "Abilitato per {{server}}", + "prefs_notifications_web_push_disabled": "Disabilitato", + "prefs_users_table_cannot_delete_or_edit": "Impossibile eliminare o modificare l'utente registrato", + "prefs_appearance_theme_title": "Tema", + "prefs_appearance_theme_system": "Sistema (predefinito)", + "prefs_appearance_theme_dark": "Modalità scura", + "prefs_appearance_theme_light": "Modalità chiara", + "prefs_reservations_table_topic_header": "Argomento", + "prefs_reservations_dialog_access_label": "Accesso", + "reservation_delete_dialog_description": "La rimozione di una prenotazione comporta la rinuncia alla proprietà dell'argomento e consente ad altri di riservarlo. Puoi mantenere o eliminare i messaggi e gli allegati esistenti.", + "prefs_reservations_table_everyone_deny_all": "Solo io posso pubblicare e iscrivermi", + "prefs_reservations_dialog_topic_label": "Argomento", + "reservation_delete_dialog_action_keep_title": "Mantieni i messaggi e gli allegati memorizzati nella cache", + "web_push_subscription_expiring_title": "Le notifiche verranno sospese", + "web_push_subscription_expiring_body": "Apri ntfy per continuare a ricevere notifiche", + "web_push_unknown_notification_title": "Notifica sconosciuta ricevuta dal server", + "account_tokens_dialog_expires_x_hours": "Il token scade tra {{hours}} ore", + "prefs_reservations_table": "Tabella argomenti riservati" } From bbce1200b4770f84dc16a66d2a9c2cad318e4876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jos=C3=A9=20m?= Date: Thu, 29 Aug 2024 05:56:50 +0000 Subject: [PATCH 051/117] Translated using Weblate (Galician) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/gl/ --- web/public/static/langs/gl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/gl.json b/web/public/static/langs/gl.json index bb4715f6..2fa8c32d 100644 --- a/web/public/static/langs/gl.json +++ b/web/public/static/langs/gl.json @@ -172,7 +172,7 @@ "account_tokens_table_token_header": "Token", "prefs_notifications_delete_after_never": "Nunca", "prefs_users_description": "Engadir/eliminar usuarias dos temas protexidos. Ten en conta que as credenciais gárdanse na almacenaxe local do navegador.", - "subscribe_dialog_subscribe_description": "Os temas poderían non estar proxetidos con contrasinal, así que elixe un nome complicado de adiviñar. Unha vez subscrita, podes PUT/POST notificacións.", + "subscribe_dialog_subscribe_description": "Os temas poden non estar protexidos con contrasinal, asi que escolle un nome que non sexa fácil de pesquisar. Unha vez suscrito, podes notificar con PUT/POST.", "account_upgrade_dialog_interval_yearly_discount_save_up_to": "aforro ata un {{discount}}%", "account_tokens_dialog_label": "Etiqueta, ex. notificación de Radarr", "account_tokens_table_expires_header": "Caducidade", From 49d258706d1806d3bcdcf32db4ef6d3e28a17fcd Mon Sep 17 00:00:00 2001 From: githubozaurus Date: Wed, 4 Sep 2024 11:26:38 +0000 Subject: [PATCH 052/117] Translated using Weblate (Romanian) Currently translated at 31.1% (126 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ro/ --- web/public/static/langs/ro.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/ro.json b/web/public/static/langs/ro.json index 67b92e1d..c58aa7b1 100644 --- a/web/public/static/langs/ro.json +++ b/web/public/static/langs/ro.json @@ -123,5 +123,8 @@ "message_bar_show_dialog": "Arată dialogul de publicare", "signup_error_username_taken": "Numele de utilizator {{username}} este deja folosit", "login_title": "Autentifică-te în contul ntfy", - "action_bar_reservation_add": "Rezervă topicul" + "action_bar_reservation_add": "Rezervă topicul", + "action_bar_mute_notifications": "Oprește notificările", + "action_bar_unmute_notifications": "Pornește notificările", + "nav_topics_title": "Subiecte abonate" } From 1c6aa49fca666bcd4facb0a286589a00d2e88b33 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Thu, 12 Sep 2024 16:48:54 +0000 Subject: [PATCH 053/117] Translated using Weblate (German) Currently translated at 95.3% (386 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/de/ --- web/public/static/langs/de.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/de.json b/web/public/static/langs/de.json index a548d0b4..17476bfd 100644 --- a/web/public/static/langs/de.json +++ b/web/public/static/langs/de.json @@ -383,5 +383,7 @@ "account_upgrade_dialog_tier_features_calls_one": "{{calls}} Telefonanrufe pro Tag", "action_bar_mute_notifications": "Benachrichtigungen stummschalten", "action_bar_unmute_notifications": "Benachrichtigungen laut schalten", - "alert_notification_permission_denied_title": "Benachrichtigungen sind blockiert" + "alert_notification_permission_denied_title": "Benachrichtigungen sind blockiert", + "alert_notification_permission_denied_description": "Bitte reaktiviere diese in deinem Browser", + "notifications_actions_failed_notification": "Aktion nicht erfolgreich" } From a92c8a9ec9c9fe5eff72fe78458f9d8c23ef3d47 Mon Sep 17 00:00:00 2001 From: Malte Saling Date: Thu, 19 Sep 2024 13:32:19 +0000 Subject: [PATCH 054/117] Translated using Weblate (German) Currently translated at 95.5% (387 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/de/ --- web/public/static/langs/de.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/de.json b/web/public/static/langs/de.json index 17476bfd..67d06f04 100644 --- a/web/public/static/langs/de.json +++ b/web/public/static/langs/de.json @@ -385,5 +385,6 @@ "action_bar_unmute_notifications": "Benachrichtigungen laut schalten", "alert_notification_permission_denied_title": "Benachrichtigungen sind blockiert", "alert_notification_permission_denied_description": "Bitte reaktiviere diese in deinem Browser", - "notifications_actions_failed_notification": "Aktion nicht erfolgreich" + "notifications_actions_failed_notification": "Aktion nicht erfolgreich", + "alert_notification_ios_install_required_title": "iOS Installation erforderlich" } From 871883f6e9699d9a41f337de78eafff2f60cd5b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petri=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Wed, 25 Sep 2024 16:00:45 +0000 Subject: [PATCH 055/117] Translated using Weblate (Finnish) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fi/ --- web/public/static/langs/fi.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/fi.json b/web/public/static/langs/fi.json index f5954f8d..ab2f6188 100644 --- a/web/public/static/langs/fi.json +++ b/web/public/static/langs/fi.json @@ -400,5 +400,11 @@ "error_boundary_button_reload_ntfy": "Lataa ntfy uudelleen", "web_push_subscription_expiring_title": "Ilmoitukset keskeytetään", "web_push_subscription_expiring_body": "Avaa ntfy jatkaaksesi ilmoitusten vastaanottamista", - "web_push_unknown_notification_title": "Tuntematon ilmoitus vastaanotettu palvelimelta" + "web_push_unknown_notification_title": "Tuntematon ilmoitus vastaanotettu palvelimelta", + "alert_notification_ios_install_required_description": "Napauta Jaa-kuvaketta ja Lisää aloitusnäyttöön ottaaksesi ilmoitukset käyttöön iOS:ssä", + "prefs_notifications_web_push_disabled_description": "Ilmoituksia vastaanotetaan, kun verkkosovellus on käynnissä (WebSocket:in kautta)", + "web_push_unknown_notification_body": "Voit joutua päivittämään ntfy:n avaamalla verkkosovelluksen", + "notifications_actions_failed_notification": "Epäonnistunut toiminto", + "subscribe_dialog_subscribe_use_another_background_info": "Ilmoituksia muilta palvelimilta ei vastaanoteta, mikäli verkkosovellus ei ole avoinna", + "prefs_notifications_web_push_enabled_description": "Ilmoituksia vastaanotetaan siitä huolimatta, että verkkosovellus ei ole käynnissä (Web Push:n kautta)" } From 236b7b7a167f52f4dadff2da5c44c98e1fc8156b Mon Sep 17 00:00:00 2001 From: Carl Fritze Date: Mon, 30 Sep 2024 13:31:05 +0000 Subject: [PATCH 056/117] Translated using Weblate (German) Currently translated at 99.5% (403 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/de/ --- web/public/static/langs/de.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/de.json b/web/public/static/langs/de.json index 67d06f04..8e7cfc12 100644 --- a/web/public/static/langs/de.json +++ b/web/public/static/langs/de.json @@ -386,5 +386,21 @@ "alert_notification_permission_denied_title": "Benachrichtigungen sind blockiert", "alert_notification_permission_denied_description": "Bitte reaktiviere diese in deinem Browser", "notifications_actions_failed_notification": "Aktion nicht erfolgreich", - "alert_notification_ios_install_required_title": "iOS Installation erforderlich" + "alert_notification_ios_install_required_title": "iOS Installation erforderlich", + "alert_notification_ios_install_required_description": "Klicke auf das Teilen-Symbol und “Zum Home-Bildschirm” um auf iOS Benachrichtigungen zu aktivieren", + "subscribe_dialog_subscribe_use_another_background_info": "Benachrichtigungen von anderen Servern werden nicht empfangen, wenn die Web App nicht geöffnet ist", + "publish_dialog_checkbox_markdown": "Als Markdown formatieren", + "prefs_notifications_web_push_title": "Hintergrund-Benachrichtigungen", + "prefs_notifications_web_push_disabled_description": "Benachrichtigungen werden empfangen wenn die Web App läuft (über WebSocket)", + "prefs_notifications_web_push_enabled": "Aktiviert für {{server}}", + "prefs_notifications_web_push_disabled": "Deaktiviert", + "prefs_appearance_theme_title": "Thema", + "prefs_appearance_theme_system": "System (Standard)", + "prefs_appearance_theme_dark": "Nachtmodus", + "prefs_appearance_theme_light": "Tagmodus", + "error_boundary_button_reload_ntfy": "ntfy neu laden", + "web_push_subscription_expiring_title": "Benachrichtigungen werden pausiert", + "web_push_subscription_expiring_body": "Öffne ntfy um weiterhin Benachrichtigungen zu erhalten", + "web_push_unknown_notification_title": "Unbekannte Benachrichtigung vom server empfangen", + "web_push_unknown_notification_body": "Du musst möglicherweise ntfy aktualisieren, indem du die Web App öffnest." } From 8acf0f43501aede2cf397c3dcdb57394912b41a9 Mon Sep 17 00:00:00 2001 From: Linerly Date: Tue, 8 Oct 2024 10:27:48 +0000 Subject: [PATCH 057/117] Translated using Weblate (Indonesian) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/id/ --- web/public/static/langs/id.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/id.json b/web/public/static/langs/id.json index a562436a..0095138b 100644 --- a/web/public/static/langs/id.json +++ b/web/public/static/langs/id.json @@ -24,7 +24,7 @@ "nav_button_subscribe": "Berlangganan ke topik", "alert_notification_permission_required_title": "Notifikasi dinonaktifkan", "alert_notification_permission_required_description": "Berikan izin ke peramban untuk menampilkan notifikasi desktop.", - "alert_not_supported_description": "Notifikasi tidak didukung dalam peramban Anda.", + "alert_not_supported_description": "Notifikasi tidak didukung dalam peramban Anda", "notifications_attachment_open_title": "Pergi ke {{url}}", "notifications_attachment_open_button": "Buka lampiran", "notifications_attachment_link_expires": "tautan kadaluwarsa {{date}}", From 58d7cb8ef80e7cdef13084fbd93a15bfb321ba5c Mon Sep 17 00:00:00 2001 From: Ricardo Vieira Date: Tue, 15 Oct 2024 18:25:07 +0000 Subject: [PATCH 058/117] Translated using Weblate (Portuguese) Currently translated at 76.2% (309 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pt/ --- web/public/static/langs/pt.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/pt.json b/web/public/static/langs/pt.json index 48159d21..d5946536 100644 --- a/web/public/static/langs/pt.json +++ b/web/public/static/langs/pt.json @@ -290,5 +290,23 @@ "account_usage_messages_title": "Mensagens publicadas", "account_usage_calls_title": "Ligações realizadas", "account_usage_calls_none": "Esta conta não pode realizar ligações", - "account_usage_reservations_title": "Tópicos reservados" + "account_usage_reservations_title": "Tópicos reservados", + "account_basics_username_title": "Utilizador", + "account_delete_dialog_description": "Isto irá eliminar definitivamente a sua conta, incluindo dados que estejam armazenados no servidor. Apos ser eliminado, o nome de utilizador ficará indisponível durante 7 dias. Se deseja mesmo proceder, por favor confirm com a sua palavra pass na caixa abaixo.", + "account_delete_dialog_button_submit": "Eliminar conta definitivamente", + "account_delete_dialog_billing_warning": "Eliminar a sua conta também cancela a sua subscrição de faturação imediatamente. Não terá acesso ao portal de faturação de futuro.", + "account_upgrade_dialog_title": "Alterar o nível da sua conta", + "account_upgrade_dialog_interval_monthly": "Mensalmente", + "account_upgrade_dialog_interval_yearly": "Anualmente", + "account_upgrade_dialog_interval_yearly_discount_save": "poupe {{discount}}%", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "poupe até {{discount}}%", + "account_delete_dialog_label": "Palavra pass", + "account_usage_cannot_create_portal_session": "Impossível abrir o portal de faturação", + "account_usage_basis_ip_description": "Estatísticas de utilização e limites para esta conta são baseadas no seu endereço IP, pelo que podem ser partilhados com outros utilizadores. Os limites mostrados acima são aproximados com base nos limites existentes.", + "account_usage_attachment_storage_description": "{{filesize}} por ficheiro, eliminado após {{expiry}}", + "account_delete_title": "Eliminar conta", + "account_delete_description": "Eliminar definitivamente a sua conta", + "account_delete_dialog_button_cancel": "Cancelar", + "account_upgrade_dialog_cancel_warning": "Isto irá cancelar a sua assinatura, e fazer downgrade da sua conta em {{date}}. Nessa data, tópicos reservados bem como mensagens guardadas no servidor serão eliminados.", + "account_upgrade_dialog_proration_info": "Proporção: Quando atualizar entre planos pagos, a diferença de preço será debitada imediatamente. Quando efetuar um downgrade para um escalão inferior, o saldo disponível será usado para futuros períodos de faturação." } From c03f79550875f77d54395d423765483fafa4ca28 Mon Sep 17 00:00:00 2001 From: Soaibuzzaman Date: Mon, 21 Oct 2024 09:19:21 +0200 Subject: [PATCH 059/117] Added translation using Weblate (Bengali) --- web/public/static/langs/bn.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 web/public/static/langs/bn.json diff --git a/web/public/static/langs/bn.json b/web/public/static/langs/bn.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/web/public/static/langs/bn.json @@ -0,0 +1 @@ +{} From 41083cfd0736074d3d96c95ea241138af316ff43 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Tue, 29 Oct 2024 12:54:57 +0000 Subject: [PATCH 060/117] Translated using Weblate (German) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/de/ --- web/public/static/langs/de.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web/public/static/langs/de.json b/web/public/static/langs/de.json index 8e7cfc12..92dec374 100644 --- a/web/public/static/langs/de.json +++ b/web/public/static/langs/de.json @@ -36,7 +36,7 @@ "message_bar_type_message": "Gib hier eine Nachricht ein", "message_bar_error_publishing": "Fehler beim Senden der Benachrichtigung", "alert_not_supported_title": "Benachrichtigungen werden nicht unterstützt", - "alert_not_supported_description": "Benachrichtigungen werden von Deinem Browser nicht unterstützt.", + "alert_not_supported_description": "Benachrichtigungen werden von Deinem Browser nicht unterstützt", "action_bar_settings": "Einstellungen", "action_bar_clear_notifications": "Alle Benachrichtigungen löschen", "alert_notification_permission_required_button": "Jetzt erlauben", @@ -402,5 +402,6 @@ "web_push_subscription_expiring_title": "Benachrichtigungen werden pausiert", "web_push_subscription_expiring_body": "Öffne ntfy um weiterhin Benachrichtigungen zu erhalten", "web_push_unknown_notification_title": "Unbekannte Benachrichtigung vom server empfangen", - "web_push_unknown_notification_body": "Du musst möglicherweise ntfy aktualisieren, indem du die Web App öffnest." + "web_push_unknown_notification_body": "Du musst möglicherweise ntfy aktualisieren, indem du die Web App öffnest.", + "prefs_notifications_web_push_enabled_description": "Benachrichtigungen werden empfangen, auch wenn die Web App nicht läuft (über Web Push)" } From 6daf4141c61dd6156240f4ff36a8e3c804df156d Mon Sep 17 00:00:00 2001 From: 109247019824 Date: Thu, 7 Nov 2024 02:27:48 +0000 Subject: [PATCH 061/117] Translated using Weblate (Bulgarian) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/bg/ --- web/public/static/langs/bg.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/bg.json b/web/public/static/langs/bg.json index 15c8cc95..59b85e5b 100644 --- a/web/public/static/langs/bg.json +++ b/web/public/static/langs/bg.json @@ -212,7 +212,7 @@ "nav_upgrade_banner_label": "Надграждане до ntfy Pro", "signup_form_confirm_password": "Парола отново", "signup_disabled": "Регистрациите са затворени", - "signup_error_creation_limit_reached": "Достигнатео е ограничението за създаване на профили", + "signup_error_creation_limit_reached": "Достигнато е ограничението за създаване на профили", "display_name_dialog_title": "Промяна на показваното име", "action_bar_reservation_edit": "Промяна на резервацията", "action_bar_sign_up": "Регистриране", From 5f6b7e6f8238e73860852e5f1a91adf6490acada Mon Sep 17 00:00:00 2001 From: Shoshin Akamine Date: Fri, 8 Nov 2024 04:31:47 +0000 Subject: [PATCH 062/117] Translated using Weblate (Japanese) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ja/ --- web/public/static/langs/ja.json | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/web/public/static/langs/ja.json b/web/public/static/langs/ja.json index 84afc30b..3d9643e0 100644 --- a/web/public/static/langs/ja.json +++ b/web/public/static/langs/ja.json @@ -7,7 +7,7 @@ "action_bar_clear_notifications": "全ての通知を消去", "action_bar_unsubscribe": "購読解除", "nav_button_documentation": "ドキュメント", - "alert_not_supported_description": "通知機能はこのブラウザではサポートされていません。", + "alert_not_supported_description": "通知機能はこのブラウザではサポートされていません", "notifications_copied_to_clipboard": "クリップボードにコピーしました", "notifications_example": "例", "publish_dialog_title_topic": "{{topic}}に送信", @@ -28,7 +28,7 @@ "message_bar_type_message": "メッセージを入力してください", "nav_topics_title": "購読しているトピック", "nav_button_subscribe": "トピックを購読", - "alert_notification_permission_required_description": "ブラウザのデスクトップ通知を許可してください。", + "alert_notification_permission_required_description": "ブラウザのデスクトップ通知を許可してください", "alert_notification_permission_required_button": "許可する", "notifications_attachment_link_expires": "リンクは {{date}} に失効します", "notifications_click_copy_url_button": "リンクをコピー", @@ -191,7 +191,7 @@ "signup_form_username": "ユーザー名", "signup_form_password": "パスワード", "signup_form_confirm_password": "パスワードを確認", - "signup_already_have_account": "アカウントをお持ちならサインイン", + "signup_already_have_account": "アカウントをお持ちならサインイン!", "signup_disabled": "サインアップは無効化されています", "signup_error_creation_limit_reached": "アカウント作成制限に達しました", "login_title": "あなたのntfyアカウントにサインイン", @@ -380,5 +380,28 @@ "account_upgrade_dialog_tier_features_calls_other": "電話 1日 {{calls}} 回", "publish_dialog_chip_call_no_verified_numbers_tooltip": "認証済み電話番号がありません", "account_basics_phone_numbers_dialog_channel_sms": "SMS", - "account_basics_phone_numbers_dialog_channel_call": "電話する" + "account_basics_phone_numbers_dialog_channel_call": "電話する", + "error_boundary_button_reload_ntfy": "ntfyをリロード", + "prefs_appearance_theme_light": "ライトモード", + "web_push_subscription_expiring_title": "通知は一時停止されます", + "web_push_subscription_expiring_body": "ntfyを開いて通知の受信を継続させてください", + "alert_notification_ios_install_required_description": "Shareアイコンをクリック・ホーム画面に追加してiOSでの通知を有効化して下さい", + "action_bar_mute_notifications": "通知をミュート", + "action_bar_unmute_notifications": "通知ミュートを解除", + "alert_notification_permission_denied_title": "通知はブロックされています", + "alert_notification_permission_denied_description": "ブラウザで通知を再度有効化してください", + "notifications_actions_failed_notification": "アクション失敗", + "alert_notification_ios_install_required_title": "iOS用インストールが必要です", + "publish_dialog_checkbox_markdown": "Markdownとして表示", + "subscribe_dialog_subscribe_use_another_background_info": "ウェブアプリが開かれていない場合は他のサーバーからの通知は受信されません", + "prefs_notifications_web_push_title": "バックグラウンド通知", + "prefs_notifications_web_push_enabled_description": "ウェブアプリが開かれていなくても通知を受信します (Web Push経由)", + "prefs_notifications_web_push_disabled_description": "ウェブアプリが開かれていなくても通知を受信します (WebSocket経由)", + "prefs_notifications_web_push_enabled": "{{server}}で有効", + "prefs_notifications_web_push_disabled": "無効", + "prefs_appearance_theme_title": "テーマ", + "prefs_appearance_theme_system": "システム (既定)", + "prefs_appearance_theme_dark": "ダークモード", + "web_push_unknown_notification_title": "不明な通知を受信しました", + "web_push_unknown_notification_body": "ウェブアプリを開いてntfyをアップデートする必要があります" } From db2dc09189d0e45e60064a08d0e1f1bc4686df8a Mon Sep 17 00:00:00 2001 From: K0ntact Date: Sat, 9 Nov 2024 11:48:42 +0000 Subject: [PATCH 063/117] Translated using Weblate (Vietnamese) Currently translated at 7.1% (29 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/vi/ --- web/public/static/langs/vi.json | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/web/public/static/langs/vi.json b/web/public/static/langs/vi.json index b2f94441..6167c4bc 100644 --- a/web/public/static/langs/vi.json +++ b/web/public/static/langs/vi.json @@ -9,13 +9,23 @@ "signup_already_have_account": "Đã có tài khoản? Đăng nhập!", "signup_disabled": "Đăng kí bị đóng", "signup_error_username_taken": "Tên {{username}} đã được sử dụng", - "signup_error_creation_limit_reached": "Đã bị giới hạn tạo tài khoản", + "signup_error_creation_limit_reached": "Đã đạt giới hạn tạo tài khoản", "login_title": "Đăng nhập vào tài khoản ntfy", "login_link_signup": "Đăng kí", - "login_disabled": "Đăng nhập bị đóng", + "login_disabled": "Đăng nhập bị vô hiệu hóa", "action_bar_show_menu": "Hiện menu", "signup_form_password": "Mật khẩu", "action_bar_settings": "Cài đặt", "signup_form_confirm_password": "Xác nhận mật khẩu", - "signup_form_button_submit": "Đăng kí" + "signup_form_button_submit": "Đăng kí", + "action_bar_change_display_name": "Đổi tên hiển thị", + "action_bar_send_test_notification": "Gửi thông báo thử", + "action_bar_clear_notifications": "Xóa tất cả thông báo", + "action_bar_logo_alt": "Logo ntfy", + "action_bar_account": "Tài khoản", + "action_bar_reservation_limit_reached": "Đã đạt giới hạn", + "action_bar_unsubscribe": "Hủy đăng kí", + "action_bar_unmute_notifications": "Bật thông báo", + "action_bar_toggle_mute": "Bật/tắt thông báo", + "action_bar_mute_notifications": "Tắt thông báo" } From b81f7b21a9d39d57fe44872b98c8e9f0476ef6eb Mon Sep 17 00:00:00 2001 From: Luis Eduardo Brito Date: Sun, 10 Nov 2024 20:09:29 +0000 Subject: [PATCH 064/117] Translated using Weblate (Portuguese (Brazil)) Currently translated at 83.9% (340 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pt_BR/ --- web/public/static/langs/pt_BR.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/pt_BR.json b/web/public/static/langs/pt_BR.json index bfaf68af..90c9ab7a 100644 --- a/web/public/static/langs/pt_BR.json +++ b/web/public/static/langs/pt_BR.json @@ -321,5 +321,23 @@ "account_upgrade_dialog_tier_current_label": "Atual", "account_upgrade_dialog_tier_price_per_month": "mês", "account_upgrade_dialog_button_cancel": "Cancelar", - "account_upgrade_dialog_tier_selected_label": "Selecionado" + "account_upgrade_dialog_tier_selected_label": "Selecionado", + "account_upgrade_dialog_tier_features_attachment_file_size": "{{filesize}} por arquivo", + "account_tokens_table_last_access_header": "Último acesso", + "account_upgrade_dialog_button_cancel_subscription": "Cancelar assinatura", + "account_tokens_table_never_expires": "Nunca expira", + "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} cobrado anualmente. Salvar {{save}}.", + "account_upgrade_dialog_tier_features_no_calls": "Nenhuma chamada", + "account_tokens_table_token_header": "Token", + "account_upgrade_dialog_button_update_subscription": "Atualizar assinatura", + "account_tokens_table_current_session": "Sessão atual do navegador", + "account_tokens_table_copied_to_clipboard": "Token de acesso copiado", + "account_tokens_title": "Tokens de Acesso", + "account_upgrade_dialog_button_redirect_signup": "Cadastre-se agora", + "account_upgrade_dialog_tier_features_calls_one": "{{calls}} chamadas diárias", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} daily phone calls", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} armazenamento total", + "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} por ano. Cobrado mensalmente.", + "account_upgrade_dialog_button_pay_now": "Pague agora para assinar", + "account_tokens_table_expires_header": "Expira" } From 1b8906f1fd3365121c5cbe67c31fb9d8a6fa96fc Mon Sep 17 00:00:00 2001 From: Cairo Braga Date: Sat, 16 Nov 2024 19:29:10 +0000 Subject: [PATCH 065/117] Translated using Weblate (Portuguese (Brazil)) Currently translated at 84.1% (341 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pt_BR/ --- web/public/static/langs/pt_BR.json | 47 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/web/public/static/langs/pt_BR.json b/web/public/static/langs/pt_BR.json index 90c9ab7a..9d4dba3a 100644 --- a/web/public/static/langs/pt_BR.json +++ b/web/public/static/langs/pt_BR.json @@ -8,10 +8,10 @@ "nav_button_settings": "Configurações", "nav_button_subscribe": "Inscrever no tópico", "alert_notification_permission_required_title": "Notificações estão desativadas", - "alert_notification_permission_required_description": "Conceder ao navegador permissão para mostrar notificações.", + "alert_notification_permission_required_description": "Conceder permissão ao seu navegador para mostrar notificações", "alert_notification_permission_required_button": "Conceder agora", "alert_not_supported_title": "Notificações não são suportadas", - "alert_not_supported_description": "Notificações não são suportadas pelo seu navegador.", + "alert_not_supported_description": "Notificações não são suportadas pelo seu navegador", "notifications_copied_to_clipboard": "Copiado para a área de transferência", "notifications_tags": "Etiquetas", "notifications_attachment_copy_url_title": "Copiar URL do anexo para a área de transferência", @@ -189,15 +189,15 @@ "prefs_users_delete_button": "Excluir usuário", "error_boundary_unsupported_indexeddb_title": "Navegação anônima não suportada", "error_boundary_unsupported_indexeddb_description": "O ntfy web app precisa do IndexedDB para funcionar, e seu navegador não suporta IndexedDB no modo de navegação privada.

Embora isso seja lamentável, também não faz muito sentido usar o ntfy web app no modo de navegação privada de qualquer maneira, porque tudo é armazenado no armazenamento do navegador. Você pode ler mais sobre isso nesta edição do GitHub, ou falar conosco em Discord ou Matrix.", - "action_bar_reservation_add": "Reserve topic", - "action_bar_reservation_edit": "Change reservation", - "signup_disabled": "Registrar está desativado", - "signup_error_username_taken": "Usuário {{username}} já existe", + "action_bar_reservation_add": "Reservar tópico", + "action_bar_reservation_edit": "Mudar reserva", + "signup_disabled": "O registro está desativado", + "signup_error_username_taken": "O nome de usuário {{username}} já está em uso", "signup_error_creation_limit_reached": "Limite de criação de contas atingido", "action_bar_reservation_delete": "Remover reserva", "action_bar_account": "Conta", - "action_bar_change_display_name": "Change display name", - "common_copy_to_clipboard": "Copiar para área de transferência", + "action_bar_change_display_name": "Mudar nome de exibição", + "common_copy_to_clipboard": "Copiar para a Área de Transferência", "login_link_signup": "Registrar", "login_title": "Entrar na sua conta ntfy", "login_form_button_submit": "Entrar", @@ -210,13 +210,13 @@ "action_bar_sign_up": "Registrar", "nav_button_account": "Conta", "signup_title": "Criar uma conta ntfy", - "signup_form_username": "Usuário", + "signup_form_username": "Nome de usuário", "signup_form_password": "Senha", "signup_form_confirm_password": "Confirmar senha", - "signup_form_button_submit": "Registrar", + "signup_form_button_submit": "Criar conta", "account_basics_phone_numbers_title": "Telefones", - "signup_form_toggle_password_visibility": "Ativar visibilidade de senha", - "signup_already_have_account": "Já possui uma conta? Entrar!", + "signup_form_toggle_password_visibility": "Alterar visibilidade da senha", + "signup_already_have_account": "Já tem uma conta? Entre!", "nav_upgrade_banner_label": "Atualizar para ntfy Pro", "account_basics_phone_numbers_dialog_description": "Para usar o recurso de notificação de chamada, é necessários adicionar e verificar pelo menos um número de telefone. A verificação pode ser feita por SMS ou chamada telefônica.", "account_basics_phone_numbers_description": "Para notificações de chamada telefônica", @@ -224,7 +224,7 @@ "account_basics_tier_canceled_subscription": "Sua assinatura foi cancelada e será rebaixada para uma conta gratuita em {{date}}.", "account_basics_password_dialog_current_password_incorrect": "Senha incorreta", "account_basics_phone_numbers_dialog_number_label": "Número de telefone", - "account_basics_password_dialog_button_submit": "Alterar senha", + "account_basics_password_dialog_button_submit": "Mudar senha", "reserve_dialog_checkbox_label": "Guardar tópico e configurar acesso", "account_basics_username_title": "Nome de usuário", "account_basics_phone_numbers_dialog_check_verification_button": "Confirmar código", @@ -250,11 +250,11 @@ "account_basics_tier_free": "Grátis", "account_basics_tier_admin": "Administrador", "publish_dialog_chip_call_no_verified_numbers_tooltip": "Nenhum número de telefone verificado", - "account_basics_password_description": "Alterar a senha da sua conta", + "account_basics_password_description": "Mudar a senha da sua conta", "publish_dialog_call_label": "Chamada telefônica", "account_usage_calls_title": "Chamadas de telefone feitas", "account_basics_tier_basic": "Básico", - "alert_not_supported_context_description": "Notificações são suportadas apenas através de HTTPS. Esta é uma limitação da API de Notificações.", + "alert_not_supported_context_description": "Notificações são suportadas somente por HTTPS. Essa é uma limitação da Notifications API.", "account_basics_phone_numbers_copied_to_clipboard": "Número de telefone copiado para a área de transferência", "account_basics_tier_title": "Tipo de conta", "account_basics_phone_numbers_dialog_number_placeholder": "ex. +1222333444", @@ -268,14 +268,14 @@ "account_basics_password_dialog_new_password_label": "Nova senha", "display_name_dialog_placeholder": "Nome de exibição", "account_usage_of_limit": "de {{limit}}", - "account_basics_password_dialog_title": "Alterar senha", + "account_basics_password_dialog_title": "Mudar senha", "account_usage_limits_reset_daily": "Os limites de uso são redefinidos diariamente à meia-noite (UTC)", "account_usage_unlimited": "Ilimitado", "account_basics_password_dialog_current_password_label": "Senha atual", "account_usage_reservations_title": "Tópicos reservados", "account_usage_calls_none": "Nenhum telefonema pode ser feito com esta conta", - "display_name_dialog_title": "Alterar o nome de exibição", - "nav_upgrade_banner_description": "Guarde tópicos, mais mensagens & emails e anexos grandes", + "display_name_dialog_title": "Alterar nome de exibição", + "nav_upgrade_banner_description": "Reserve tópicos, mais mensagens e e-mails, e anexos maiores", "publish_dialog_call_reset": "Remover chamada telefônica", "account_basics_phone_numbers_dialog_code_label": "Código de verificação", "account_basics_tier_paid_until": "Assinatura paga até {{date}}, será renovada automaticamente", @@ -302,15 +302,15 @@ "subscribe_dialog_subscribe_use_another_background_info": "Notificações de outros servidores não serão recebidas quando o web app não estiver aberto", "account_usage_basis_ip_description": "As estatísticas e limites de uso desta conta são baseados no seu endereço IP, portanto, podem ser compartilhados com outros usuários. Os limites mostrados acima são aproximados com base nos limites de taxa existentes.", "account_usage_cannot_create_portal_session": "Não foi possível abrir o portal de cobrança", - "account_delete_description": "Deletar conta permanentemente", + "account_delete_description": "Deletar sua conta permanentemente", "account_delete_dialog_button_cancel": "Cancelar", "account_delete_dialog_button_submit": "Deletar conta permanentemente", "account_upgrade_dialog_interval_monthly": "Mensal", "account_upgrade_dialog_interval_yearly_discount_save": "desconto de {{discount}}%", "account_upgrade_dialog_interval_yearly_discount_save_up_to": "desconto de até {{discount}}%", "account_upgrade_dialog_cancel_warning": "Isso cancelará sua assinatura e fará downgrade de sua conta em {{date}}. Nessa data, as reservas de tópicos, bem como as mensagens armazenadas em cache no servidor serão excluídas.", - "account_upgrade_dialog_reservations_warning_one": "O nível selecionada permite menos tópicos reservados do que a camada atual. Antes de alterar seu nível, exclua pelo menos uma reserva. Você pode remover reservas nas Configurações", - "account_upgrade_dialog_reservations_warning_other": "O plano selecionado permite menos tópicos reservados do que o seu plano atual. Antes de mudar seu plano, exclua por favor ao menos {{count}} reservas. Você pode remover reservas em Configurações.", + "account_upgrade_dialog_reservations_warning_one": "O nível selecionado permite menos tópicos reservados do que o nível atual. Antes de alterar seu nível, exclua pelo menos uma reserva. Você pode remover reservas nas Configurações.", + "account_upgrade_dialog_reservations_warning_other": "O nível selecionado permite menos tópicos reservados do que o seu nível atual. Antes de mudar seu nível, por favor exclua ao menos {{count}} reservas. Você pode remover reservas nas Configurações.", "account_upgrade_dialog_tier_features_no_reservations": "Sem tópicos reservados", "account_upgrade_dialog_tier_features_messages_one": "{{messages}} mensagen diária", "account_upgrade_dialog_tier_features_emails_one": "{{emails}} email diário", @@ -335,9 +335,10 @@ "account_tokens_title": "Tokens de Acesso", "account_upgrade_dialog_button_redirect_signup": "Cadastre-se agora", "account_upgrade_dialog_tier_features_calls_one": "{{calls}} chamadas diárias", - "account_upgrade_dialog_tier_features_calls_other": "{{calls}} daily phone calls", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} chamadas telefônicas diárias", "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} armazenamento total", "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} por ano. Cobrado mensalmente.", "account_upgrade_dialog_button_pay_now": "Pague agora para assinar", - "account_tokens_table_expires_header": "Expira" + "account_tokens_table_expires_header": "Expira", + "prefs_users_description_no_sync": "Usuários e senhas não estão sincronizados com a sua conta." } From 1e1b2be46405ee9dd9918248c866141f8fd63b7a Mon Sep 17 00:00:00 2001 From: Ed Date: Sat, 16 Nov 2024 19:17:31 +0000 Subject: [PATCH 066/117] Translated using Weblate (Portuguese) Currently translated at 76.5% (310 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pt/ --- web/public/static/langs/pt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/pt.json b/web/public/static/langs/pt.json index d5946536..8e57445e 100644 --- a/web/public/static/langs/pt.json +++ b/web/public/static/langs/pt.json @@ -291,7 +291,7 @@ "account_usage_calls_title": "Ligações realizadas", "account_usage_calls_none": "Esta conta não pode realizar ligações", "account_usage_reservations_title": "Tópicos reservados", - "account_basics_username_title": "Utilizador", + "account_basics_username_title": "Usuário", "account_delete_dialog_description": "Isto irá eliminar definitivamente a sua conta, incluindo dados que estejam armazenados no servidor. Apos ser eliminado, o nome de utilizador ficará indisponível durante 7 dias. Se deseja mesmo proceder, por favor confirm com a sua palavra pass na caixa abaixo.", "account_delete_dialog_button_submit": "Eliminar conta definitivamente", "account_delete_dialog_billing_warning": "Eliminar a sua conta também cancela a sua subscrição de faturação imediatamente. Não terá acesso ao portal de faturação de futuro.", From 86c548ae37e91e3a91878034848c0e779dadc02f Mon Sep 17 00:00:00 2001 From: Cairo Braga Date: Sat, 16 Nov 2024 19:16:50 +0000 Subject: [PATCH 067/117] Translated using Weblate (Portuguese) Currently translated at 76.5% (310 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pt/ --- web/public/static/langs/pt.json | 49 +++++++++++++++++---------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/web/public/static/langs/pt.json b/web/public/static/langs/pt.json index 8e57445e..1c988568 100644 --- a/web/public/static/langs/pt.json +++ b/web/public/static/langs/pt.json @@ -16,7 +16,7 @@ "nav_button_muted": "Notificações desativadas", "nav_button_connecting": "A ligar", "alert_notification_permission_required_title": "As notificações estão desativadas", - "alert_notification_permission_required_description": "Conceder permissão ao seu navegador para mostrar notificações.", + "alert_notification_permission_required_description": "Conceder permissão ao seu navegador para mostrar notificações", "alert_not_supported_title": "Notificações não suportadas", "notifications_list": "Lista de notificações", "alert_not_supported_description": "As notificações não são suportadas pelo seu navegador", @@ -215,14 +215,14 @@ "action_bar_reservation_add": "Reservar tópico", "action_bar_sign_up": "Registar", "nav_button_account": "Conta", - "common_copy_to_clipboard": "Copiar", - "nav_upgrade_banner_label": "Atualizar para ntfy Pro", - "alert_not_supported_context_description": "Notificações são suportadas apenas sobre HTTPS. Essa é uma limitação da API de Notificações.", - "display_name_dialog_title": "Alterar nome mostrado", - "display_name_dialog_description": "Configura um nome alternativo ao tópico que é mostrado na lista de assinaturas. Isto ajuda a identificar tópicos com nomes complicados mais facilmente.", - "display_name_dialog_placeholder": "Nome exibido", + "common_copy_to_clipboard": "Copiar à área de transferência", + "nav_upgrade_banner_label": "Upgrade para ntfy Pro", + "alert_not_supported_context_description": "As notificações são apenas suportadas através de HTTPS. Isto é uma limitação da Notifications API.", + "display_name_dialog_title": "Alterar o nome público", + "display_name_dialog_description": "Configurar um nome alternativo para um tópico que é mostrado na lista de subscrições. Isto ajuda a identificar tópicos com nomes complicados mais facilmente.", + "display_name_dialog_placeholder": "Nome público", "reserve_dialog_checkbox_label": "Reservar tópico e configurar acesso", - "publish_dialog_call_label": "Chamada telefônica", + "publish_dialog_call_label": "Chamada telefónica", "publish_dialog_call_placeholder": "Número de telefone para ligar com a mensagem, ex: +12223334444, ou 'Sim'", "publish_dialog_call_reset": "Remover chamada telefônica", "publish_dialog_chip_call_label": "Chamada telefônica", @@ -231,17 +231,17 @@ "alert_notification_ios_install_required_description": "Clique no ícone Compartilhar e Adicionar à Tela Inicial para ativar as notificações no iOS", "publish_dialog_checkbox_markdown": "Formatar como Markdown", "publish_dialog_chip_call_no_verified_numbers_tooltip": "Números de telefone não verificados", - "subscribe_dialog_error_topic_already_reserved": "Tópico já está reservado", + "subscribe_dialog_error_topic_already_reserved": "Tópico já reservado", "action_bar_mute_notifications": "Silenciar notificações", "alert_notification_permission_denied_title": "Notificações estão bloqueadas", "alert_notification_permission_denied_description": "Por favor reative-as em seu navegador", "alert_notification_ios_install_required_title": "Requer instalação em iOS", "notifications_actions_failed_notification": "Houve uma falha na ação", - "publish_dialog_call_item": "Ligar para o número {{number}}", + "publish_dialog_call_item": "Ligar para o número de telefone {{number}}", "subscribe_dialog_subscribe_use_another_background_info": "Notificações de outros servidores não serão recebidas enquanto o aplicativo web não estiver aberto", - "account_basics_username_description": "Olá, é você ❤", - "account_basics_password_dialog_new_password_label": "Nova senha", - "account_basics_password_dialog_current_password_incorrect": "Senha incorreta", + "account_basics_username_description": "Olá, és tu ❤", + "account_basics_password_dialog_new_password_label": "Nova palavra-passe", + "account_basics_password_dialog_current_password_incorrect": "Palavra-passe inválida", "account_basics_phone_numbers_title": "Números de telefone", "account_basics_phone_numbers_dialog_description": "Para utilizar o recurso de notificação por ligação, você precisa adicionar e verificar pelo menos um número de telefone. A verificação poderá ser feita via SMS ou ligação telefônica.", "account_basics_phone_numbers_dialog_title": "Adicionar número de telefone", @@ -258,20 +258,20 @@ "account_usage_reservations_none": "Esta conta não possui tópicos reservados", "account_usage_attachment_storage_title": "Armazenamento de anexos", "account_usage_emails_title": "E-mails enviados", - "account_basics_password_description": "Alterar a senha da sua conta", - "account_basics_password_dialog_title": "Alterar a senha", + "account_basics_password_description": "Mudar a palavra-passe da conta", + "account_basics_password_dialog_title": "Mudar a palavra-passe", "account_basics_phone_numbers_description": "Para notificações por ligação", "account_basics_tier_paid_until": "Assinatura paga até {{date}}, e será renovada automaticamente", - "account_basics_password_dialog_confirm_password_label": "Confirmar senha", - "account_basics_password_dialog_button_submit": "Alterar senha", + "account_basics_password_dialog_confirm_password_label": "Confirmar palavra-passe", + "account_basics_password_dialog_button_submit": "Mudar palavra-passe", "account_basics_title": "Conta", - "account_basics_username_admin_tooltip": "Você é Administrador", - "account_basics_password_title": "Senha", - "account_basics_password_dialog_current_password_label": "Senha atual", + "account_basics_username_admin_tooltip": "És Admin", + "account_basics_password_title": "Palavra-passe", + "account_basics_password_dialog_current_password_label": "Palavra-passe atual", "account_basics_phone_numbers_no_phone_numbers_yet": "Nenhum número de telefone", "account_basics_phone_numbers_copied_to_clipboard": "Telefones copiados para área de transferência", "account_basics_phone_numbers_dialog_channel_sms": "SMS", - "account_usage_title": "Uso", + "account_usage_title": "Utilização", "account_usage_of_limit": "de {{limit}}", "account_usage_unlimited": "Ilimitado", "account_usage_limits_reset_daily": "Limites de uso são resetados diariamente à meia noite (UTC)", @@ -292,7 +292,7 @@ "account_usage_calls_none": "Esta conta não pode realizar ligações", "account_usage_reservations_title": "Tópicos reservados", "account_basics_username_title": "Usuário", - "account_delete_dialog_description": "Isto irá eliminar definitivamente a sua conta, incluindo dados que estejam armazenados no servidor. Apos ser eliminado, o nome de utilizador ficará indisponível durante 7 dias. Se deseja mesmo proceder, por favor confirm com a sua palavra pass na caixa abaixo.", + "account_delete_dialog_description": "Isto irá eliminar definitivamente a sua conta, incluindo dados que estejam armazenados no servidor. Apos ser eliminado, o nome de utilizador ficará indisponível durante 7 dias. Se deseja mesmo proceder, por favor confirme com a sua palavra-passe na caixa abaixo.", "account_delete_dialog_button_submit": "Eliminar conta definitivamente", "account_delete_dialog_billing_warning": "Eliminar a sua conta também cancela a sua subscrição de faturação imediatamente. Não terá acesso ao portal de faturação de futuro.", "account_upgrade_dialog_title": "Alterar o nível da sua conta", @@ -300,7 +300,7 @@ "account_upgrade_dialog_interval_yearly": "Anualmente", "account_upgrade_dialog_interval_yearly_discount_save": "poupe {{discount}}%", "account_upgrade_dialog_interval_yearly_discount_save_up_to": "poupe até {{discount}}%", - "account_delete_dialog_label": "Palavra pass", + "account_delete_dialog_label": "Palavra-passe", "account_usage_cannot_create_portal_session": "Impossível abrir o portal de faturação", "account_usage_basis_ip_description": "Estatísticas de utilização e limites para esta conta são baseadas no seu endereço IP, pelo que podem ser partilhados com outros utilizadores. Os limites mostrados acima são aproximados com base nos limites existentes.", "account_usage_attachment_storage_description": "{{filesize}} por ficheiro, eliminado após {{expiry}}", @@ -308,5 +308,6 @@ "account_delete_description": "Eliminar definitivamente a sua conta", "account_delete_dialog_button_cancel": "Cancelar", "account_upgrade_dialog_cancel_warning": "Isto irá cancelar a sua assinatura, e fazer downgrade da sua conta em {{date}}. Nessa data, tópicos reservados bem como mensagens guardadas no servidor serão eliminados.", - "account_upgrade_dialog_proration_info": "Proporção: Quando atualizar entre planos pagos, a diferença de preço será debitada imediatamente. Quando efetuar um downgrade para um escalão inferior, o saldo disponível será usado para futuros períodos de faturação." + "account_upgrade_dialog_proration_info": "Proporção: Quando atualizar entre planos pagos, a diferença de preço será debitada imediatamente. Quando efetuar um downgrade para um escalão inferior, o saldo disponível será usado para futuros períodos de faturação.", + "prefs_users_description_no_sync": "Utilizadores e palavras-passe não estão sincronizados com a sua conta." } From 70a9301e25eda903e2126ece20dae7e21e882578 Mon Sep 17 00:00:00 2001 From: Christer Solstrand Johannessen Date: Fri, 22 Nov 2024 12:22:02 +0000 Subject: [PATCH 068/117] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 51.1% (207 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/nb_NO/ --- web/public/static/langs/nb_NO.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/nb_NO.json b/web/public/static/langs/nb_NO.json index ca259523..530c5242 100644 --- a/web/public/static/langs/nb_NO.json +++ b/web/public/static/langs/nb_NO.json @@ -195,5 +195,16 @@ "signup_form_username": "Brukernavn", "signup_form_password": "Passord", "signup_form_button_submit": "Meld deg på", - "signup_form_confirm_password": "Bekreft passord" + "signup_form_confirm_password": "Bekreft passord", + "signup_disabled": "Registrering er deaktivert", + "common_copy_to_clipboard": "Kopier til utklippstavle", + "signup_form_toggle_password_visibility": "Slå av/på passordvisning", + "signup_already_have_account": "Har du allerede en konto? Logg inn!", + "signup_error_username_taken": "Brukernavnet {{username}} er allerede opptatt", + "signup_error_creation_limit_reached": "Grense for nye kontoer nådd", + "login_title": "Logg inn på ntfy-kontoen din", + "login_form_button_submit": "Logg inn", + "login_link_signup": "Registrer deg", + "login_disabled": "Innlogging deaktivert", + "action_bar_change_display_name": "Endre visningsnavn" } From b26666f635b8e9873e96f3a4f9a5f24d8350601d Mon Sep 17 00:00:00 2001 From: Christer Solstrand Johannessen Date: Mon, 25 Nov 2024 13:09:59 +0000 Subject: [PATCH 069/117] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/nb_NO/ --- web/public/static/langs/nb_NO.json | 205 ++++++++++++++++++++++++++++- 1 file changed, 201 insertions(+), 4 deletions(-) diff --git a/web/public/static/langs/nb_NO.json b/web/public/static/langs/nb_NO.json index 530c5242..2bcf6391 100644 --- a/web/public/static/langs/nb_NO.json +++ b/web/public/static/langs/nb_NO.json @@ -3,7 +3,7 @@ "action_bar_settings": "Innstillinger", "action_bar_send_test_notification": "Send testmerknad", "action_bar_clear_notifications": "Tøm alle merknader", - "action_bar_unsubscribe": "Opphev abonnement", + "action_bar_unsubscribe": "Meld av", "message_bar_type_message": "Skriv en melding her", "nav_button_all_notifications": "Alle merknader", "nav_button_settings": "Innstillinger", @@ -133,8 +133,8 @@ "publish_dialog_chip_delay_label": "Forsink leveringen", "publish_dialog_details_examples_description": "For eksempler og en detaljert beskrivelse av alle sendefunksjoner, se dokumentasjonen.", "publish_dialog_base_url_placeholder": "Tjeneste-URL, f.eks. https://example.com", - "alert_notification_permission_required_description": "Gi nettleseren din tillatelse til å vise skrivebordsvarsler.", - "alert_not_supported_description": "Varsler støttes ikke i nettleseren din.", + "alert_notification_permission_required_description": "Gi nettleseren din tillatelse til å vise skrivebordsvarsler", + "alert_not_supported_description": "Varsler støttes ikke i nettleseren din", "notifications_attachment_file_app": "Android-app-fil", "notifications_no_subscriptions_description": "Klikk på \"{{linktext}}\"-koblingen for å opprette eller abonnere på et emne. Etter det kan du sende meldinger via PUT eller POST, og du vil motta varsler her.", "notifications_actions_http_request_title": "Send HTTP {{metode}} til {{url}}", @@ -206,5 +206,202 @@ "login_form_button_submit": "Logg inn", "login_link_signup": "Registrer deg", "login_disabled": "Innlogging deaktivert", - "action_bar_change_display_name": "Endre visningsnavn" + "action_bar_change_display_name": "Endre visningsnavn", + "account_basics_tier_interval_yearly": "årlig", + "account_basics_tier_change_button": "Endre", + "account_usage_reservations_title": "Reserverte emner", + "account_usage_cannot_create_portal_session": "Kunne ikke åpne betalingsportalen", + "account_delete_dialog_label": "Passord", + "account_tokens_table_copied_to_clipboard": "Tilgangstoken kopiert", + "account_tokens_table_last_origin_tooltip": "Fra IP-adresse {{ip}}, klikk for å gjøre oppslag", + "account_tokens_dialog_title_create": "Opprett tilgangstoken", + "account_tokens_delete_dialog_title": "Slett tilgangstoken", + "prefs_users_table_cannot_delete_or_edit": "Kan ikke slette eller redigere innlogget bruker", + "prefs_reservations_table_everyone_deny_all": "Bare jeg kan publisere og abonnere", + "prefs_reservations_dialog_access_label": "Tilgang", + "reservation_delete_dialog_action_keep_title": "Behold mellomlagrede meldinger og vedlegg", + "action_bar_reservation_add": "Reserver emne", + "action_bar_reservation_edit": "Endre reservasjon", + "action_bar_reservation_delete": "Fjern reservasjon", + "action_bar_reservation_limit_reached": "Grense nådd", + "account_basics_phone_numbers_dialog_description": "For å bruke ringevarslingsfunksjonen må du legge til og verifisere minst ett telefonnummer. Verifisering kan gjøres vis SMS eller oppringing.", + "account_basics_tier_interval_monthly": "månedlig", + "account_basics_tier_upgrade_button": "Oppgrader til Pro", + "account_usage_emails_title": "E-poster sendt", + "account_delete_description": "Slett kontoen din permanent", + "account_usage_calls_title": "Telefonsamtaler", + "account_upgrade_dialog_interval_monthly": "Månedlig", + "account_upgrade_dialog_tier_features_reservations_other": "{{reservations}} reserverte emner", + "account_upgrade_dialog_tier_features_messages_other": "{{messages}} daglige meldinger", + "account_upgrade_dialog_tier_features_emails_other": "{{emails}} daglige e-poster", + "account_upgrade_dialog_tier_features_calls_one": "{{calls}} daglige telefonsamtaler", + "account_upgrade_dialog_tier_selected_label": "Valgt", + "account_upgrade_dialog_tier_current_label": "Nåværende", + "account_upgrade_dialog_button_cancel": "Avbryt", + "account_upgrade_dialog_billing_contact_email": "For faktureringsspørsmål, vennligst kontakt oss direkte.", + "account_tokens_table_token_header": "Token", + "account_tokens_table_label_header": "Etikett", + "account_tokens_table_cannot_delete_or_edit": "Kan ikke redigere eller slette nåværende økt-token", + "account_tokens_table_create_token_button": "Opprett tilgangstoken", + "account_tokens_dialog_expires_unchanged": "La utløpsdato være uendret", + "account_tokens_dialog_expires_x_hours": "Token utløper om {{hours}} timer", + "account_tokens_delete_dialog_description": "Før du sletter et tilgangstoken, sørg for at ingen applikasjoner eller script bruker det. Denne handlingen kan ikke angres.", + "account_tokens_delete_dialog_submit_button": "Slett token permanent", + "prefs_users_description_no_sync": "Brukere og passord synkroniseres ikke til kontoen din.", + "prefs_reservations_dialog_title_delete": "Slett emnereservasjon", + "prefs_reservations_dialog_topic_label": "Emne", + "display_name_dialog_title": "Endre visningsnavn", + "reserve_dialog_checkbox_label": "Rserver emne og sett opp tilgang", + "publish_dialog_chip_call_label": "Telefonsamtale", + "account_basics_tier_free": "Gratis", + "account_basics_tier_basic": "Grunnleggende", + "account_basics_tier_canceled_subscription": "Abonnementet ditt ble avsluttet og blir degradert til en gratiskonto den {{date}}.", + "account_delete_dialog_description": "Dette vil slette kontoen din permanent, inkludert alle data som er lagret på serveren. Etter sletting vil brukernavnet ditt være utilgjengelig i 7 dager. Hvis du virkelig vil fortsette, vennligst bekreft ved å skrive passordet ditt i boksen under.", + "account_upgrade_dialog_proration_info": "Pro-rate: Når du oppgraderer mellom betalte kontotyper, vil prisforskjellen bli fakturert umiddelbart. Når du nedgraderer til en billigere kontotype, vil det allerede innbetalte beløpet brukes til å betale for fremtidige regningsperioder.", + "account_upgrade_dialog_reservations_warning_other": "Det valgte nivået tillater færre reserverte emner enn ditt nåvære nivå. Før du endrer nivå, vennligst slett minst {{count}} reservasjoner. Du kan slette reservasjoner i Innstillingene.", + "account_upgrade_dialog_tier_features_messages_one": "{{messages}} daglig melding", + "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} pr. år. Fakturert månedlig.", + "account_upgrade_dialog_button_redirect_signup": "Registrer deg nå", + "account_upgrade_dialog_button_pay_now": "Betal nå og abonner", + "account_upgrade_dialog_button_cancel_subscription": "Avslutt abonnement", + "account_tokens_description": "Bruk tilgangstokener når du publiserer og abonnerer via ntfy-APIet, slik at du ikke trenger å sende innloggingsinformasjon for kontoen din. Se dokumentasjonen for å lære mer.", + "account_tokens_table_current_session": "Nåværende nettleserøkt", + "prefs_appearance_theme_system": "System (standard)", + "prefs_notifications_web_push_disabled_description": "Varslinger mottas når web-appen kjører (via WebSocket)", + "prefs_appearance_theme_title": "Tema", + "prefs_appearance_theme_dark": "Mørk modus", + "prefs_appearance_theme_light": "Lys modus", + "prefs_reservations_title": "Reserverte emner", + "prefs_reservations_table_click_to_subscribe": "Klikk for å abonnere", + "prefs_reservations_table_everyone_read_write": "Alle kan publisere og abonnere", + "prefs_reservations_table_not_subscribed": "Ikke abonnent", + "prefs_reservations_table_everyone_write_only": "Jeg kan publisere og abonnere, alle andre kan publisere", + "prefs_reservations_dialog_title_add": "Reserver emne", + "prefs_reservations_dialog_title_edit": "Rediger reservert emne", + "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} reservert emne", + "reservation_delete_dialog_action_delete_title": "Slett mellomlagrede meldinger og vedlegg", + "nav_upgrade_banner_label": "Oppgrader til ntfy Pro", + "nav_upgrade_banner_description": "Reserver emner, flere meldinger & e-poster, og større vedlegg", + "account_delete_dialog_button_submit": "Slett konto permanent", + "account_basics_username_description": "Hei, det er deg ❤", + "account_basics_username_admin_tooltip": "Du er administrator", + "account_basics_password_title": "Passord", + "account_basics_password_description": "Endre passordet ditt", + "account_usage_title": "Forbruk", + "account_delete_dialog_button_cancel": "Avbryt", + "account_tokens_dialog_title_delete": "Slett tilgangstoken", + "account_tokens_dialog_label": "Etikett, f.eks. Radarr-varslinger", + "prefs_reservations_table": "Tabell over reserverte emner", + "prefs_reservations_edit_button": "Rediger tilgang til emne", + "prefs_reservations_delete_button": "Nullstill tilgang til emne", + "prefs_reservations_table_topic_header": "Emne", + "account_basics_title": "Konto", + "account_basics_phone_numbers_dialog_code_label": "Verifiseringskode", + "alert_notification_permission_denied_title": "Varslinger blokkert", + "alert_notification_permission_denied_description": "Vennligst reaktiver dem i nettleseren din", + "alert_notification_ios_install_required_title": "iOS-installasjon kreves", + "alert_notification_ios_install_required_description": "Klikk på Del-ikonet og Legg til hjemmeskjerm for å aktivere varslinger på iOS", + "action_bar_mute_notifications": "Demp varslinger", + "action_bar_unmute_notifications": "Avdemp varslinger", + "action_bar_profile_title": "Profil", + "action_bar_profile_logout": "Logg ut", + "action_bar_sign_in": "Logg inn", + "action_bar_sign_up": "Registrer deg", + "alert_not_supported_context_description": "Varslinger er kun støttet over HTTPS. Dette er en begrensning i Varslings-APIet.", + "notifications_actions_failed_notification": "Handling feilet", + "display_name_dialog_description": "Angi et alternativt navn for et emne som vises i abonneringslisten. Dette hjelper til med å enklere identifisere emner med kompliserte navn.", + "display_name_dialog_placeholder": "Visningnavn", + "publish_dialog_call_label": "Telefonsamtale", + "publish_dialog_call_item": "Ring telefonnummer {{number}}", + "publish_dialog_call_reset": "Fjern telefonsamtale", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "Ingen verfiserte telefonnumre", + "publish_dialog_checkbox_markdown": "Formatter som Markdown", + "subscribe_dialog_subscribe_use_another_background_info": "Varslinger fra andre servere vil ikke bli tatt imot når webappen ikke er åpen", + "subscribe_dialog_subscribe_button_generate_topic_name": "Generer navn", + "subscribe_dialog_error_topic_already_reserved": "Emne allerede reservert", + "account_basics_username_title": "Brukernavn", + "account_basics_password_dialog_title": "Endre passord", + "account_basics_password_dialog_current_password_label": "Nåværende passord", + "account_basics_password_dialog_new_password_label": "Nytt passord", + "account_basics_password_dialog_confirm_password_label": "Bekreft passord", + "account_basics_password_dialog_button_submit": "Endre passord", + "account_basics_password_dialog_current_password_incorrect": "Passordet er feil", + "account_basics_phone_numbers_title": "Telefonnumre", + "account_basics_phone_numbers_description": "For telefonvarsling", + "account_basics_phone_numbers_no_phone_numbers_yet": "Ingen telefonnumre enda", + "account_basics_phone_numbers_copied_to_clipboard": "Telefonnummer kopiert til utklippstavle", + "account_basics_phone_numbers_dialog_title": "Legg til telefonnummer", + "account_basics_phone_numbers_dialog_number_label": "Telefonnummer", + "account_basics_phone_numbers_dialog_number_placeholder": "f.eks. +1222333444", + "account_basics_phone_numbers_dialog_verify_button_sms": "Send SMS", + "account_basics_phone_numbers_dialog_verify_button_call": "Ring meg", + "account_basics_phone_numbers_dialog_code_placeholder": "f.eks. 123456", + "account_basics_phone_numbers_dialog_check_verification_button": "Bekreft kode", + "account_basics_phone_numbers_dialog_channel_sms": "SMS", + "account_basics_phone_numbers_dialog_channel_call": "Ring", + "account_usage_of_limit": "av {{limit}}", + "account_usage_unlimited": "Ubegrenset", + "account_usage_limits_reset_daily": "Forbruksgrenser nullstilles hver dag ved midnatt (UTC)", + "account_basics_tier_title": "Kontotype", + "account_basics_tier_description": "Din kontos styrke", + "account_basics_tier_admin": "Administrator", + "account_basics_tier_admin_suffix_with_tier": "(med {{tier}} nivå)", + "account_basics_tier_admin_suffix_no_tier": "(ingen nivå)", + "account_basics_tier_paid_until": "Abonnement betalt til {{date}}, og vil bli fornyet automatisk", + "account_basics_tier_payment_overdue": "Betalingen din har forfalt. Vennligst oppdater betalingsmetoden din, hvis ikke blir kontoen din snart degradert.", + "account_basics_tier_manage_billing_button": "Behandle betalinger", + "account_usage_messages_title": "Publiserte meldinger", + "account_usage_calls_none": "Ingen telefonsamtaler kan foretas med denne kontoen", + "account_usage_reservations_none": "Ingen reserverte emner for denne kontoen", + "account_usage_attachment_storage_title": "Vedleggslagring", + "account_usage_basis_ip_description": "Forbruksstatistikk og -grenser for denne kontoen er basert på IP-adressen din, så det kan være de er delt med andre brukere. Forbruksgrenser vist over er omtrentlige, basert på eksisterende begrensninger.", + "account_delete_title": "Slett konto", + "account_delete_dialog_billing_warning": "Sletting av kontoen din avslutter også abonnementet og betalingene dine umiddelbart. Du vil ikke ha tilgang til betalingsportalen lenger.", + "account_upgrade_dialog_title": "Endre kontonivå", + "account_upgrade_dialog_interval_yearly": "Årlig", + "account_upgrade_dialog_interval_yearly_discount_save": "spar {{discount}}%", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "spar inntil {{discount}}%", + "account_upgrade_dialog_cancel_warning": "Dette vil avslutte abonnementet ditt, og nedgradere kontoen din den {{date}}. På den datoen vil alle emnereservasjoner såvel som meldinger lagret på serveren bli slettet.", + "account_upgrade_dialog_reservations_warning_one": "Det valgte nivået tillater færre reserverte emner enn ditt nåvære nivå. Før du endrer nivå, vennligst slett minst én reservasjon. Du kan slette reservasjoner i Innstillingene.", + "account_upgrade_dialog_tier_features_no_reservations": "Ingen reserverte emner", + "account_upgrade_dialog_tier_features_emails_one": "{{emails}} daglig e-post", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} daglige telefonsamtaler", + "account_upgrade_dialog_tier_features_no_calls": "Ingen telefonsamtaler", + "account_upgrade_dialog_tier_features_attachment_file_size": "{{filesize}} pr. fil", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} total lagringsplass", + "account_upgrade_dialog_tier_price_per_month": "måned", + "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} fakturert årlig. Spar {{save}}.", + "account_upgrade_dialog_billing_contact_website": "For faktureringsspørsmål, vennligst se vår nettside.", + "account_upgrade_dialog_button_update_subscription": "Oppdater abonnement", + "account_tokens_title": "Tilgangstokener", + "account_tokens_table_last_access_header": "Sist aksessert", + "account_tokens_table_expires_header": "Utløper", + "account_tokens_table_never_expires": "Utløper aldri", + "account_tokens_dialog_title_edit": "Rediger tilgangstoken", + "account_tokens_dialog_button_create": "Opprett token", + "account_tokens_dialog_button_update": "Oppdater token", + "account_tokens_dialog_button_cancel": "Avbryt", + "account_tokens_dialog_expires_label": "Tilgangstoken utløper om", + "account_tokens_dialog_expires_x_days": "Token utløper om {{days}} dager", + "account_tokens_dialog_expires_never": "Token utløper aldri", + "prefs_notifications_web_push_title": "Bakgrunnsvarslinger", + "prefs_notifications_web_push_enabled_description": "Varslinger mottas send om web-appen ikke kjører (via Web Push)", + "prefs_notifications_web_push_enabled": "Aktivert for {{server}}", + "prefs_notifications_web_push_disabled": "Deaktivert", + "prefs_reservations_description": "Du kan reservere emnenavn for personlig bruk her. Reservasjon av et emne gir deg eierskap over emnet og lar deg definere tilgangsrettigheter for andre brukere av dette emnet.", + "prefs_reservations_limit_reached": "Du har nådd grensen for antall reserverte emner du kan ha.", + "prefs_reservations_add_button": "Legg til reservert emne", + "prefs_reservations_table_access_header": "Tilgang", + "prefs_reservations_table_everyone_read_only": "Jeg kan publisere og abonnere, alle andre kan abonnere", + "prefs_reservations_dialog_description": "Reservering av et emne gir deg eierskap over emnet, og lar deg definere tilgangsrettigheter for andre brukere av emnet.", + "reservation_delete_dialog_description": "Ved å fjerne en reservasjon gir du fra deg eierskapet over emnet, og gir dermed andre muligheten til å reservere det. Du kan beholde eller slette eksisterende meldinger og vedlegg.", + "reservation_delete_dialog_action_keep_description": "Meldinger og vedlegg som er mellomlagret på serveren vil bli synlige for alle som kjenner til emnenavnet.", + "reservation_delete_dialog_action_delete_description": "Mellomlagrede meldinger og vedlegg vil bli permanent slettet. Denne handlingen kan ikke angres.", + "reservation_delete_dialog_submit_button": "Slett reservasjon", + "error_boundary_button_reload_ntfy": "Last inn ntfy på nytt", + "web_push_subscription_expiring_title": "Varslinger vil bli satt på pause", + "web_push_subscription_expiring_body": "Åpne ntfy for å fortsette å motta varslinger", + "web_push_unknown_notification_title": "Ukjent varsel mottatt fra server", + "web_push_unknown_notification_body": "Du må muligens oppdatere ntfy ved å åpne web-appen", + "account_usage_attachment_storage_description": "{{filesize}} pr. fil, slettet etter {{expiry}}" } From ae9fa856766b3b12f8ffb9e8a2550c6dc7c1eeed Mon Sep 17 00:00:00 2001 From: qtm Date: Tue, 3 Dec 2024 16:52:37 +0000 Subject: [PATCH 070/117] Translated using Weblate (Russian) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ru/ --- web/public/static/langs/ru.json | 98 ++++++++++++++++----------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/web/public/static/langs/ru.json b/web/public/static/langs/ru.json index a1f26d70..0c2eaae3 100644 --- a/web/public/static/langs/ru.json +++ b/web/public/static/langs/ru.json @@ -67,7 +67,7 @@ "subscribe_dialog_subscribe_title": "Подписаться на тему", "publish_dialog_button_cancel": "Отмена", "subscribe_dialog_subscribe_description": "Темы могут быть не защищены паролем, поэтому укажите сложное имя. После подписки Вы сможете отправлять уведомления используя PUT/POST-запросы.", - "prefs_users_description": "Добавляйте/удаляйте пользователей для защищенных тем. Обратите внимание, что имя пользователя и пароль хранятся в локальном хранилище браузера.", + "prefs_users_description": "Вы можете управлять пользователями для защищённых тем. Учтите, что имя учётные данные хранятся в локальном хранилище браузера.", "error_boundary_description": "Это не должно было случиться. Нам очень жаль.
Если Вы можете уделить минуту своего времени, пожалуйста сообщите об этом на GitHub, или дайте нам знать через Discord или Matrix.", "publish_dialog_email_placeholder": "Адрес для пересылки уведомления. Например, phil@example.com", "publish_dialog_attach_placeholder": "Прикрепите файл по URL. Например, https://f-droid.org/F-Droid.apk", @@ -96,36 +96,36 @@ "subscribe_dialog_subscribe_button_subscribe": "Подписаться", "subscribe_dialog_login_title": "Требуется авторизация", "subscribe_dialog_login_description": "Эта тема защищена паролем. Пожалуйста, введите имя пользователя и пароль, чтобы подписаться.", - "subscribe_dialog_login_username_label": "Имя пользователя. Например, phil", + "subscribe_dialog_login_username_label": "Имя пользователя. Например, oleg", "subscribe_dialog_login_password_label": "Пароль", "common_back": "Назад", "subscribe_dialog_login_button_login": "Войти", "subscribe_dialog_error_user_not_authorized": "Пользователь {{username}} не авторизован", "subscribe_dialog_error_user_anonymous": "анонимный пользователь", "prefs_notifications_title": "Уведомления", - "prefs_notifications_sound_title": "Звук уведомления", - "prefs_notifications_sound_description_none": "Уведомления не воспроизводят никаких звуков при получении", + "prefs_notifications_sound_title": "Звук уведомлений", + "prefs_notifications_sound_description_none": "При получении уведомлений не звуки не проигрываются", "prefs_notifications_sound_no_sound": "Без звука", "prefs_notifications_min_priority_title": "Минимальный приоритет", - "prefs_notifications_min_priority_description_any": "Показывать все уведомления, независимо от приоритета", + "prefs_notifications_min_priority_description_any": "Показывать все уведомления, независимо от их приоритета", "prefs_notifications_min_priority_description_x_or_higher": "Показывать уведомления, если приоритет {{number}} ({{name}}) или выше", "prefs_notifications_min_priority_description_max": "Показывать уведомления, если приоритет равен 5 (максимальный)", "prefs_notifications_min_priority_any": "Любой приоритет", "prefs_notifications_min_priority_low_and_higher": "Низкий приоритет и выше", "prefs_notifications_min_priority_max_only": "Только максимальный приоритет", - "prefs_notifications_delete_after_title": "Удалить уведомления", + "prefs_notifications_delete_after_title": "Удаление уведомлений", "prefs_notifications_delete_after_never": "Никогда", "prefs_notifications_delete_after_three_hours": "Через три часа", - "prefs_notifications_sound_description_some": "Уведомления воспроизводят звук {{sound}}", + "prefs_notifications_sound_description_some": "При уведомлениях проигрывается звук {{sound}}", "prefs_notifications_min_priority_default_and_higher": "Стандартный приоритет и выше", "prefs_notifications_delete_after_one_day": "Через день", "prefs_notifications_delete_after_one_week": "Через неделю", "prefs_notifications_delete_after_one_month": "Через месяц", "prefs_notifications_delete_after_never_description": "Уведомления никогда не удаляются автоматически", - "prefs_notifications_delete_after_three_hours_description": "Уведомления автоматически удаляются через три часа", - "prefs_notifications_delete_after_one_day_description": "Уведомления автоматически удаляются через один день", - "prefs_notifications_delete_after_one_week_description": "Уведомления автоматически удаляются через неделю", - "prefs_notifications_delete_after_one_month_description": "Уведомления автоматически удаляются через месяц", + "prefs_notifications_delete_after_three_hours_description": "Уведомления удаляются автоматически через три часа", + "prefs_notifications_delete_after_one_day_description": "Уведомления удаляются автоматически через один день", + "prefs_notifications_delete_after_one_week_description": "Уведомления удаляются автоматически через неделю", + "prefs_notifications_delete_after_one_month_description": "Уведомления удаляются автоматически через месяц", "prefs_users_title": "Управление пользователями", "prefs_users_add_button": "Добавить пользователя", "prefs_users_table_user_header": "Пользователь", @@ -133,7 +133,7 @@ "prefs_users_dialog_title_add": "Добавить пользователя", "prefs_users_dialog_title_edit": "Редактировать пользователя", "prefs_users_dialog_base_url_label": "URL-адрес сервера. Например, https://ntfy.sh", - "prefs_users_dialog_username_label": "Имя пользователя. Например, phil", + "prefs_users_dialog_username_label": "Имя пользователя. Например, oleg", "prefs_users_dialog_password_label": "Пароль", "common_cancel": "Отмена", "common_add": "Добавить", @@ -157,11 +157,11 @@ "emoji_picker_search_clear": "Сбросить поиск", "account_upgrade_dialog_cancel_warning": "Это действие отменит Вашу подписку и переведет Вашую учетную запись на бесплатное обслуживание {{date}}. При наступлении этой даты, все резервирования и сообщения в кэше будут удалены.", "account_tokens_table_create_token_button": "Создать токен доступа", - "account_tokens_table_last_origin_tooltip": "с IP-адреса {{ip}}, нажмите для подробностей", + "account_tokens_table_last_origin_tooltip": "С IP-адреса {{ip}}, нажмите для подробностей", "account_tokens_dialog_title_edit": "Изменить токен доступа", "account_delete_dialog_button_cancel": "Отмена", "account_delete_dialog_billing_warning": "Удаление учетной записи также отменяет все платные подписки. У Вас не будет доступа к порталу оплаты.", - "account_delete_dialog_description": "Это действие безвозвратно удалит Вашу учетную запись, включая все Ваши данные хранящиеся на сервере. После удаления, Ваше имя пользователя не будет доступно для регистрации в течении 7 дней. Если Вы действительно хотите продолжить, пожалуйста введите Ваш пароль ниже.", + "account_delete_dialog_description": "Это действие безвозвратно удалит вашу учётную запись, включая все данные, хранящиеся на сервере. После удаления имя пользователя вашей учётной записи не будет доступно для регистрации в течение 7 дней. Если вы точно хотите продолжить, пожалуйста, введите свой пароль ниже.", "account_delete_dialog_label": "Пароль", "reservation_delete_dialog_action_keep_description": "Сообщения и вложения которые находятся в кэше сервера станут доступны всем, кто знает имя темы.", "prefs_reservations_table": "Список зарезервированных тем", @@ -173,7 +173,7 @@ "prefs_reservations_table_not_subscribed": "Не подписан", "prefs_reservations_table_everyone_deny_all": "Только я могу публиковать и подписываться", "prefs_reservations_table_everyone_read_write": "Все могут публиковать и подписываться", - "prefs_reservations_table_click_to_subscribe": "Нажмите чтобы подписаться", + "prefs_reservations_table_click_to_subscribe": "Нажмите, чтобы подписаться", "prefs_reservations_dialog_title_add": "Зарезервировать тему", "prefs_reservations_dialog_title_delete": "Удалить резервирование", "prefs_reservations_dialog_title_edit": "Изменение резервированной темы", @@ -202,7 +202,7 @@ "account_tokens_dialog_expires_never": "Токен никогда не истекает", "prefs_notifications_sound_play": "Воспроизводить выбранный звук", "account_upgrade_dialog_tier_features_reservations_other": "{{reservations}} зарезервированных тем", - "account_upgrade_dialog_tier_features_emails_other": "{{emails}} эл. сообщений в день", + "account_upgrade_dialog_tier_features_emails_other": "{{emails}} эл. писем в день", "account_basics_tier_free": "Бесплатный", "account_tokens_dialog_title_create": "Создать токен доступа", "account_tokens_dialog_title_delete": "Удалить токен доступа", @@ -215,11 +215,11 @@ "account_upgrade_dialog_tier_current_label": "Текущая", "account_upgrade_dialog_button_cancel": "Отмена", "prefs_users_edit_button": "Редактировать пользователя", - "account_basics_tier_upgrade_button": "Подписаться на Pro", + "account_basics_tier_upgrade_button": "Обновить до Pro", "account_basics_tier_paid_until": "Подписка оплачена до {{date}} и будет продляться автоматически", "account_basics_tier_change_button": "Изменить", - "account_delete_dialog_button_submit": "Безвозвратно удалить учетную запись", - "account_upgrade_dialog_title": "Изменить уровень учетной записи", + "account_delete_dialog_button_submit": "Безвозвратно удалить эту учётную запись", + "account_upgrade_dialog_title": "Изменить уровень учётной записи", "account_usage_basis_ip_description": "Статистика и ограничения на использование учитываются по IP-адресу, поэтому они могут совмещаться с другими пользователями. Уровни, указанные выше, примерно соответствуют текущим ограничениям.", "publish_dialog_topic_reset": "Сбросить тему", "account_basics_tier_admin_suffix_no_tier": "(без подписки)", @@ -231,9 +231,9 @@ "signup_form_toggle_password_visibility": "Показать/скрыть пароль", "signup_disabled": "Регистрация недоступна", "signup_error_username_taken": "Имя пользователя {{username}} уже занято", - "signup_title": "Создать учетную запись ntfy", - "signup_already_have_account": "Уже есть учетная запись? Войдите!", - "signup_error_creation_limit_reached": "Лимит на создание учетных записей исчерпан", + "signup_title": "Создать учётную запись ntfy", + "signup_already_have_account": "Уже есть учётная запись? Войдите!", + "signup_error_creation_limit_reached": "Исчерпано ограничение создания учётных записей", "login_form_button_submit": "Вход", "login_link_signup": "Регистрация", "login_disabled": "Вход недоступен", @@ -249,12 +249,12 @@ "message_bar_publish": "Опубликовать сообщение", "nav_button_muted": "Уведомления заглушены", "nav_button_connecting": "установка соединения", - "action_bar_account": "Учетная запись", - "login_title": "Вход в Вашу учетную запись ntfy", + "action_bar_account": "Учётная запись", + "login_title": "Войдите в учётную запись ntfy", "action_bar_reservation_limit_reached": "Лимит исчерпан", "action_bar_toggle_mute": "Заглушить/разрешить уведомления", - "nav_button_account": "Учетная запись", - "nav_upgrade_banner_label": "Купить подписку ntfy Pro", + "nav_button_account": "Учётная запись", + "nav_upgrade_banner_label": "Подписка ntfy Pro", "message_bar_show_dialog": "Открыть диалог публикации", "notifications_list": "Список уведомлений", "notifications_list_item": "Уведомление", @@ -279,12 +279,12 @@ "subscribe_dialog_subscribe_base_url_label": "URL-адрес сервера", "subscribe_dialog_subscribe_button_generate_topic_name": "Сгенерировать случайное имя", "subscribe_dialog_error_topic_already_reserved": "Тема уже зарезервирована", - "account_basics_title": "Учетная запись", + "account_basics_title": "Учётная запись", "account_basics_username_title": "Имя пользователя", - "account_basics_username_admin_tooltip": "Вы Администратор", + "account_basics_username_admin_tooltip": "Вы администратор", "account_basics_password_title": "Пароль", - "account_basics_username_description": "Это Вы! :)", - "account_basics_password_description": "Смена пароля учетной записи", + "account_basics_username_description": "Это вы! :)", + "account_basics_password_description": "Смена пароля учётной записи", "account_basics_password_dialog_title": "Смена пароля", "account_basics_password_dialog_current_password_label": "Текущий пароль", "account_basics_password_dialog_current_password_incorrect": "Введен неверный пароль", @@ -292,11 +292,11 @@ "account_usage_of_limit": "из {{limit}}", "account_usage_unlimited": "Неограниченно", "account_usage_limits_reset_daily": "Ограничения сбрасываются ежедневно в полночь (UTC)", - "account_basics_tier_description": "Уровень Вашей учетной записи", + "account_basics_tier_description": "Уровень вашей учётной записи", "account_basics_tier_admin": "Администратор", - "account_basics_tier_admin_suffix_with_tier": "(с {{tier}} подпиской)", - "account_basics_tier_payment_overdue": "У Вас задолженность по оплате. Пожалуйста проверьте метод оплаты, иначе Вы скоро потеряете преимущества Вашей подписки.", - "account_basics_tier_canceled_subscription": "Ваша подписка была отменена; учетная запись перейдет на бесплатное обслуживание {{date}}.", + "account_basics_tier_admin_suffix_with_tier": "(с подпиской {{tier}})", + "account_basics_tier_payment_overdue": "У вас имеется задолженность по оплате. Пожалуйста, проверьте метод оплаты, иначе скоро вы утратите преимущества подписки.", + "account_basics_tier_canceled_subscription": "Ваша подписка была отменена. Учётная запись перейдет на бесплатное обслуживание {{date}}.", "account_basics_tier_manage_billing_button": "Управление оплатой", "account_usage_messages_title": "Опубликованные сообщения", "account_usage_emails_title": "Отправленные электронные сообщения", @@ -305,8 +305,8 @@ "account_usage_attachment_storage_title": "Хранение вложений", "account_usage_attachment_storage_description": "{{filesize}} за файл, удаляются спустя {{expiry}}", "account_usage_cannot_create_portal_session": "Невозможно открыть портал оплаты", - "account_delete_title": "Удалить учетную запись", - "account_delete_description": "Безвозвратно удалить Вашу учетную запись", + "account_delete_title": "Удаление учётной записи", + "account_delete_description": "Безвозвратное удаление этой учётной записи", "account_upgrade_dialog_button_redirect_signup": "Зарегистрироваться", "account_upgrade_dialog_button_pay_now": "Оплатить и подписаться", "account_upgrade_dialog_button_cancel_subscription": "Отменить подписку", @@ -319,8 +319,8 @@ "account_tokens_table_expires_header": "Истекает", "account_tokens_dialog_label": "Название, например Radarr notifications", "prefs_reservations_title": "Зарезервированные темы", - "prefs_reservations_description": "Здесь Вы можете резервировать темы для личного пользования. Резервирование дает Вам возможность управлять темой и настраивать правила доступа к ней для пользователей.", - "prefs_reservations_limit_reached": "Вы исчерпали Ваш лимит на количество зарезервированных тем.", + "prefs_reservations_description": "Здесь вы можете резервировать темы для личного пользования. Резервирование дает возможность управления темой и настройки правил доступа к ней для других пользователей.", + "prefs_reservations_limit_reached": "Лимит количества зарезервированных тем исчерпан.", "prefs_reservations_add_button": "Добавить тему", "prefs_reservations_edit_button": "Настройка доступа", "prefs_reservations_delete_button": "Сбросить правила доступа", @@ -339,7 +339,7 @@ "account_basics_password_dialog_new_password_label": "Новый пароль", "account_basics_password_dialog_confirm_password_label": "Подтвердите пароль", "account_basics_password_dialog_button_submit": "Сменить пароль", - "account_basics_tier_title": "Тип учетной записи", + "account_basics_tier_title": "Тип учётной записи", "error_boundary_unsupported_indexeddb_description": "Веб-приложение ntfy использует IndexedDB, который не поддерживается Вашим браузером в приватном режиме.

Хотя это и не лучший вариант, использовать веб-приложение ntfy в приватном режиме не имеет особого смысла, так как все данные храняться в локальном хранилище браузера. Вы можете узнать больше в этом отчете на GitHub или связавшись с нами через Discord или Matrix.", "account_basics_tier_interval_monthly": "ежемесячно", "account_basics_tier_interval_yearly": "ежегодно", @@ -356,11 +356,11 @@ "publish_dialog_call_reset": "Удалить вызов", "account_basics_phone_numbers_dialog_description": "Для того что бы использовать возможность уведомлений о вызовах, нужно добавить и проверить хотя бы один номер телефона. Проверить можно используя SMS или звонок.", "account_basics_phone_numbers_dialog_title": "Добавить номер телефона", - "account_basics_phone_numbers_dialog_number_placeholder": "например +1222333444", - "account_basics_phone_numbers_dialog_code_placeholder": "например 123456", + "account_basics_phone_numbers_dialog_number_placeholder": "например, +72223334444", + "account_basics_phone_numbers_dialog_code_placeholder": "например, 123456", "account_basics_phone_numbers_dialog_verify_button_sms": "Отправить SMS", "account_usage_calls_title": "Совершённые вызовы", - "account_usage_calls_none": "Невозможно совершать вызовы с этим аккаунтом", + "account_usage_calls_none": "Невозможно совершать вызовы с этой учётной записью", "publish_dialog_chip_call_no_verified_numbers_tooltip": "Нет проверенных номеров", "account_basics_phone_numbers_copied_to_clipboard": "Номер телефона скопирован в буфер обмена", "account_upgrade_dialog_tier_features_no_calls": "Нет вызовов", @@ -371,8 +371,8 @@ "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} зарезервированная тема", "account_basics_phone_numbers_no_phone_numbers_yet": "Телефонных номеров пока нет", "publish_dialog_chip_call_label": "Звонок", - "account_upgrade_dialog_tier_features_emails_one": "{{emails}} ежедневное письмо", - "account_upgrade_dialog_tier_features_messages_one": "{{messages}} ежедневное сообщения", + "account_upgrade_dialog_tier_features_emails_one": "{{emails}} эл. письмо в день", + "account_upgrade_dialog_tier_features_messages_one": "{{messages}} сообщение в день", "account_basics_phone_numbers_description": "Для уведомлений о телефонных звонках", "publish_dialog_call_label": "Звонок", "account_basics_phone_numbers_dialog_channel_call": "Позвонить", @@ -383,8 +383,8 @@ "account_basics_phone_numbers_dialog_channel_sms": "SMS", "action_bar_mute_notifications": "Заглушить уведомления", "action_bar_unmute_notifications": "Разрешить уведомления", - "alert_notification_permission_denied_title": "Уведомления заблокированы", - "alert_notification_permission_denied_description": "Пожалуйста, разрешите их в своём браузере", + "alert_notification_permission_denied_title": "Уведомления не разрешены", + "alert_notification_permission_denied_description": "Пожалуйста, разрешите отправку уведомлений браузере", "alert_notification_ios_install_required_title": "iOS требует установку", "alert_notification_ios_install_required_description": "Нажмите на значок \"Поделиться\" и \"Добавить на главный экран\", чтобы включить уведомления на iOS", "error_boundary_button_reload_ntfy": "Перезагрузить ntfy", @@ -401,7 +401,7 @@ "notifications_actions_failed_notification": "Неудачное действие", "publish_dialog_checkbox_markdown": "Форматировать как Markdown", "subscribe_dialog_subscribe_use_another_background_info": "Уведомления с других серверов не будут получены, когда веб-приложение не открыто", - "prefs_appearance_theme_system": "Системный (по умолчанию)", - "prefs_appearance_theme_dark": "Ночной режим", - "prefs_appearance_theme_light": "Дневной режим" + "prefs_appearance_theme_system": "Как в системе (по умолчанию)", + "prefs_appearance_theme_dark": "Тёмная", + "prefs_appearance_theme_light": "Светлая" } From fc93de9a28c51d872eb489a1336d85c68d3fdb2f Mon Sep 17 00:00:00 2001 From: Ihor Kalnytskyi Date: Sat, 4 Jan 2025 21:15:23 +0000 Subject: [PATCH 071/117] Translated using Weblate (Ukrainian) Currently translated at 99.7% (404 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/uk/ --- web/public/static/langs/uk.json | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/web/public/static/langs/uk.json b/web/public/static/langs/uk.json index b09822dd..c51dfcb3 100644 --- a/web/public/static/langs/uk.json +++ b/web/public/static/langs/uk.json @@ -88,7 +88,7 @@ "action_bar_unsubscribe": "Відписатися", "message_bar_publish": "Опублікувати повідомлення", "nav_button_all_notifications": "Усі сповіщення", - "alert_not_supported_description": "Ваш браузер не підтримує сповіщення.", + "alert_not_supported_description": "Ваш браузер не підтримує сповіщення", "notifications_list": "Список сповіщень", "notifications_mark_read": "Позначити як прочитане", "notifications_delete": "Видалити", @@ -381,5 +381,27 @@ "reservation_delete_dialog_action_delete_title": "Видалення кешованих повідомлень і вкладень", "reservation_delete_dialog_action_keep_title": "Збереження кешованих повідомлень і вкладень", "reservation_delete_dialog_action_keep_description": "Повідомлення і вкладення, які кешуються на сервері, стають загальнодоступними для людей, які знають назву теми.", - "reservation_delete_dialog_action_delete_description": "Кешовані повідомлення та вкладення будуть видалені назавжди. Ця дія не може бути скасована." + "reservation_delete_dialog_action_delete_description": "Кешовані повідомлення та вкладення будуть видалені назавжди. Ця дія не може бути скасована.", + "subscribe_dialog_subscribe_use_another_background_info": "Сповіщення з інших серверів не надходитимуть, якщо вебзастосунок не відкрито", + "publish_dialog_checkbox_markdown": "Форматувати як Markdown", + "alert_notification_ios_install_required_description": "Натисніть піктограму \"Поділитися\" та \"Додати на головний екран\", щоб увімкнути сповіщення на iOS", + "prefs_appearance_theme_dark": "Темний режим", + "web_push_unknown_notification_title": "Отримано невідоме сповіщення від сервера", + "action_bar_mute_notifications": "Вимкнути сповіщення", + "action_bar_unmute_notifications": "Увімкнути сповіщення", + "alert_notification_permission_denied_title": "Сповіщення заблоковано", + "alert_notification_permission_denied_description": "Будь ласка, увімкніть їх повторно у своєму браузері", + "notifications_actions_failed_notification": "Невдала дія", + "prefs_notifications_web_push_title": "Фонові сповіщення", + "prefs_notifications_web_push_enabled_description": "Сповіщення надходитимуть навіть якщо вебзастосунок не запущений (за допомоги Web Push)", + "prefs_notifications_web_push_disabled_description": "Сповіщення надходитимуть якщо вебзастосунок запущений (за допомоги WebSocket)", + "prefs_notifications_web_push_enabled": "Увімкнено для {{server}}", + "prefs_notifications_web_push_disabled": "Вимкнено", + "prefs_appearance_theme_title": "Тема", + "prefs_appearance_theme_system": "Система (за замовчуванням)", + "prefs_appearance_theme_light": "Світлий режим", + "error_boundary_button_reload_ntfy": "Перезавантажити ntfy", + "web_push_subscription_expiring_title": "Сповіщення буде призупинено", + "web_push_subscription_expiring_body": "Відкрийте ntfy, щоб продовжити отримувати сповіщення", + "web_push_unknown_notification_body": "Можливо вам потрібно оновити ntfy шляхом відкриття вебзастосунку" } From 92de1b5a88c7772374899db45f43c7d2fba69296 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Thu, 9 Jan 2025 18:08:01 +0000 Subject: [PATCH 072/117] Translated using Weblate (Persian) Currently translated at 13.8% (56 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fa/ --- web/public/static/langs/fa.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/fa.json b/web/public/static/langs/fa.json index 9ef390d2..188dba45 100644 --- a/web/public/static/langs/fa.json +++ b/web/public/static/langs/fa.json @@ -32,5 +32,6 @@ "action_bar_reservation_edit": "تغییر رزرو", "action_bar_reservation_delete": "حذف رزرو", "action_bar_mute_notifications": "ساکت کردن اعلان ها", - "action_bar_clear_notifications": "پاک کردن تمام اعلان ها" + "action_bar_clear_notifications": "پاک کردن تمام اعلان ها", + "action_bar_toggle_action_menu": "گشودن يا بستن فهرست کنش" } From 79852fec5904c1cb40ff4a1f34524ac64896d026 Mon Sep 17 00:00:00 2001 From: Faraz Sadri Alamdari Date: Wed, 8 Jan 2025 23:49:02 +0000 Subject: [PATCH 073/117] Translated using Weblate (Persian) Currently translated at 13.8% (56 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fa/ --- web/public/static/langs/fa.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/fa.json b/web/public/static/langs/fa.json index 188dba45..e538b378 100644 --- a/web/public/static/langs/fa.json +++ b/web/public/static/langs/fa.json @@ -33,5 +33,26 @@ "action_bar_reservation_delete": "حذف رزرو", "action_bar_mute_notifications": "ساکت کردن اعلان ها", "action_bar_clear_notifications": "پاک کردن تمام اعلان ها", - "action_bar_toggle_action_menu": "گشودن يا بستن فهرست کنش" + "action_bar_toggle_action_menu": "گشودن يا بستن فهرست کنش", + "action_bar_profile_title": "پروفایل", + "action_bar_profile_settings": "تنظیمات", + "action_bar_profile_logout": "خروج", + "action_bar_sign_in": "ورود", + "action_bar_sign_up": "ثبت نام", + "message_bar_type_message": "یک پیام بنویسید", + "message_bar_error_publishing": "خطا در انتظار اعلان", + "message_bar_publish": "انتشار پیام", + "nav_button_all_notifications": "همه اعلان‌ها", + "nav_button_account": "حساب کاربری", + "nav_button_settings": "تنظیمات", + "nav_button_documentation": "مستندات", + "nav_button_publish_message": "انتشار اعلان", + "nav_button_muted": "اعلان بی‌صدا شد", + "nav_button_connecting": "در حال اتصال", + "nav_upgrade_banner_label": "ارتقا با ntfy پیشرفته", + "alert_notification_permission_required_title": "اعلان‌ها غیرفعال هستند", + "alert_notification_permission_required_description": "به مرورگر خود اجازه دهید تا اعلان‌های دسکتاپ را نمایش دهد", + "alert_notification_permission_denied_title": "اعلان‌ها مسدود هستند", + "alert_notification_ios_install_required_title": "لازم به نصب نسخه iOS است", + "alert_notification_ios_install_required_description": "برای فعال کردن اعلان‌ها در iOS، روی نماد اشتراک‌گذاری و افزودن به صفحه اصلی کلیک کنید" } From 04df6f1390564dd1d0453b584d61d341af6f4a93 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Thu, 9 Jan 2025 18:08:11 +0000 Subject: [PATCH 074/117] Translated using Weblate (Persian) Currently translated at 13.8% (56 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fa/ --- web/public/static/langs/fa.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/fa.json b/web/public/static/langs/fa.json index e538b378..4d46c422 100644 --- a/web/public/static/langs/fa.json +++ b/web/public/static/langs/fa.json @@ -34,7 +34,7 @@ "action_bar_mute_notifications": "ساکت کردن اعلان ها", "action_bar_clear_notifications": "پاک کردن تمام اعلان ها", "action_bar_toggle_action_menu": "گشودن يا بستن فهرست کنش", - "action_bar_profile_title": "پروفایل", + "action_bar_profile_title": "نمايه", "action_bar_profile_settings": "تنظیمات", "action_bar_profile_logout": "خروج", "action_bar_sign_in": "ورود", From 161ce468fe3de5e8a69184e3624f602ccfa79665 Mon Sep 17 00:00:00 2001 From: Marius Pop Date: Sun, 12 Jan 2025 19:36:27 +0000 Subject: [PATCH 075/117] Translated using Weblate (Romanian) Currently translated at 46.6% (189 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ro/ --- web/public/static/langs/ro.json | 73 ++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 6 deletions(-) diff --git a/web/public/static/langs/ro.json b/web/public/static/langs/ro.json index c58aa7b1..1d950b38 100644 --- a/web/public/static/langs/ro.json +++ b/web/public/static/langs/ro.json @@ -27,8 +27,8 @@ "alert_notification_permission_required_title": "Notificările sunt dezactivate", "alert_notification_permission_required_button": "Permite acum", "alert_not_supported_title": "Notificările nu sunt acceptate", - "alert_not_supported_description": "Notificările nu sunt acceptate în browser.", - "alert_notification_permission_required_description": "Permite browser-ului să afișeze notificări.", + "alert_not_supported_description": "Notificările nu sunt acceptate în browserul tău", + "alert_notification_permission_required_description": "Permite browser-ului să afișeze notificări", "notifications_list": "Lista de notificări", "notifications_list_item": "Notificare", "notifications_mark_read": "Marchează ca citit", @@ -102,9 +102,9 @@ "publish_dialog_emoji_picker_show": "Alege un emoji", "notifications_loading": "Încărcare notificări…", "publish_dialog_priority_low": "Prioritate joasă", - "signup_form_username": "Nume de utilizator", - "signup_form_button_submit": "Înscrie-te", - "common_copy_to_clipboard": "Copiază în clipboard", + "signup_form_username": "Utilizator", + "signup_form_button_submit": "Înregistrare", + "common_copy_to_clipboard": "Copiază", "signup_form_toggle_password_visibility": "Schimbă vizibilitatea parolei", "signup_title": "Crează un cont ntfy", "signup_already_have_account": "Deja ai un cont? Autentifică-te!", @@ -126,5 +126,66 @@ "action_bar_reservation_add": "Rezervă topicul", "action_bar_mute_notifications": "Oprește notificările", "action_bar_unmute_notifications": "Pornește notificările", - "nav_topics_title": "Subiecte abonate" + "nav_topics_title": "Subiecte abonate", + "publish_dialog_chip_attach_url_label": "Atașează fișier prin URL", + "publish_dialog_call_label": "Apel telefonic", + "publish_dialog_button_cancel_sending": "Anulează trimiterea", + "subscribe_dialog_subscribe_title": "Abonează-te la subiect", + "subscribe_dialog_login_password_label": "Parolă", + "subscribe_dialog_login_button_login": "Autentificare", + "subscribe_dialog_error_user_not_authorized": "Utilizatorul {{username}} nu este autorizat", + "account_basics_title": "Cont", + "account_basics_username_title": "Nume de utilizator", + "account_basics_username_description": "Hei, ești tu ❤", + "subscribe_dialog_error_topic_already_reserved": "Subiectul este deja rezervat", + "publish_dialog_attached_file_title": "Fișier atașat:", + "publish_dialog_attached_file_filename_placeholder": "Nume fișier atașat", + "publish_dialog_attached_file_remove": "Elimină fișierul atașat", + "emoji_picker_search_placeholder": "Caută emoji", + "nav_button_muted": "Notificări dezactivate", + "alert_notification_permission_denied_title": "Notificările sunt blocate", + "alert_notification_ios_install_required_description": "Apasă pe butonul Partajare și Adăugați la ecranul principal pentru a porni notificările pe iOS", + "alert_notification_ios_install_required_title": "Instalare iOS necesară", + "alert_notification_permission_denied_description": "Repornește-le în browserul tău", + "alert_not_supported_context_description": "Notificările sunt acceptate doar prin HTTPS. Aceasta este o limitare a API-ului de notificări.", + "notifications_actions_failed_notification": "Acțiune nereușită", + "publish_dialog_email_placeholder": "Adresă către care se va redirecționa notificarea, ex. phil@example.com", + "publish_dialog_email_reset": "Șterge redirecționare email", + "publish_dialog_call_item": "Apelează numărul de telefon {{number}}", + "publish_dialog_attach_label": "URL atașament", + "publish_dialog_attach_placeholder": "Atașează fișier prin URL, ex. https://f-droid.org/F-Droid.apk", + "publish_dialog_attach_reset": "Șterge atașament URL", + "publish_dialog_filename_label": "Nume fișier", + "publish_dialog_filename_placeholder": "Nume fișier atașament", + "publish_dialog_delay_label": "Întârziere", + "publish_dialog_call_reset": "Șterge apel telefonic", + "publish_dialog_delay_placeholder": "Întârzie livrarea, ex. {{unixTimestamp}}, {{relativeTime}}, sau \"{{naturalLanguage}}\" (doar engleză)", + "publish_dialog_delay_reset": "Șterge livrare întârziată", + "publish_dialog_other_features": "Alte funcționalități:", + "publish_dialog_chip_click_label": "Accesează URL-ul", + "publish_dialog_chip_email_label": "Redirecționează către email", + "publish_dialog_chip_call_label": "Apel telefonic", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "Nu există numere de telefon verificate", + "publish_dialog_chip_attach_file_label": "Atașează fișier local", + "publish_dialog_chip_delay_label": "Întârziere livrare", + "publish_dialog_chip_topic_label": "Schimbă subiectul", + "publish_dialog_details_examples_description": "Pentru exemple și o descriere detaliată a tuturor funcțiilor de trimitere, vă rugăm să consultați documentația.", + "publish_dialog_button_cancel": "Anulează", + "publish_dialog_button_send": "Trimite", + "publish_dialog_checkbox_markdown": "Formatează ca Markdown", + "publish_dialog_checkbox_publish_another": "Publică altul", + "publish_dialog_drop_file_here": "Trage fișierul aici", + "emoji_picker_search_clear": "Șterge căutarea", + "subscribe_dialog_subscribe_description": "Subiectele nu pot fi protejate prin parolă, așa că alege un nume care să nu fie ușor de ghicit. Odată abonat, poți utiliza metodele PUT/POST pentru a trimite notificări.", + "subscribe_dialog_subscribe_topic_placeholder": "Nume subiect, de exemplu, phil_alerts", + "subscribe_dialog_subscribe_use_another_label": "Foloseșste alt server", + "subscribe_dialog_subscribe_use_another_background_info": "Notificările de la alte servere nu vor fi primite atunci când aplicația web nu este deschisă", + "subscribe_dialog_subscribe_base_url_label": "URL serviciu", + "subscribe_dialog_subscribe_button_generate_topic_name": "Generează nume", + "subscribe_dialog_subscribe_button_cancel": "Anulează", + "subscribe_dialog_subscribe_button_subscribe": "Abonează-te", + "subscribe_dialog_login_title": "Autentificare necesară", + "subscribe_dialog_login_description": "Acest subiect este protejat prin parolă. Vă rugăm să introduceți numele de utilizator și parola pentru a vă abona.", + "subscribe_dialog_login_username_label": "Nume de utilizator, de exemplu, phil", + "subscribe_dialog_error_user_anonymous": "anonim" } From e76e6274a39c6775a85d19a27eb499698b028dc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=AE=A4=E0=AE=AE=E0=AE=BF=E0=AE=B4=E0=AF=8D=E0=AE=A8?= =?UTF-8?q?=E0=AF=87=E0=AE=B0=E0=AE=AE=E0=AF=8D?= Date: Mon, 20 Jan 2025 16:28:13 +0100 Subject: [PATCH 076/117] Added translation using Weblate (Tamil) --- web/public/static/langs/ta.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 web/public/static/langs/ta.json diff --git a/web/public/static/langs/ta.json b/web/public/static/langs/ta.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/web/public/static/langs/ta.json @@ -0,0 +1 @@ +{} From dd45fd90b77cbb678b67dfbade5e6fa7ed8e8f92 Mon Sep 17 00:00:00 2001 From: AtomicDude Date: Mon, 20 Jan 2025 17:30:59 +0000 Subject: [PATCH 077/117] Translated using Weblate (Romanian) Currently translated at 56.7% (230 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ro/ --- web/public/static/langs/ro.json | 43 ++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/ro.json b/web/public/static/langs/ro.json index 1d950b38..df000eca 100644 --- a/web/public/static/langs/ro.json +++ b/web/public/static/langs/ro.json @@ -187,5 +187,46 @@ "subscribe_dialog_login_title": "Autentificare necesară", "subscribe_dialog_login_description": "Acest subiect este protejat prin parolă. Vă rugăm să introduceți numele de utilizator și parola pentru a vă abona.", "subscribe_dialog_login_username_label": "Nume de utilizator, de exemplu, phil", - "subscribe_dialog_error_user_anonymous": "anonim" + "subscribe_dialog_error_user_anonymous": "anonim", + "account_basics_tier_interval_monthly": "lunar", + "account_basics_password_dialog_title": "Schimbă parola", + "account_basics_password_dialog_current_password_label": "Parola actuală", + "account_basics_phone_numbers_copied_to_clipboard": "Numărul de telefon a fost copiat", + "account_basics_username_admin_tooltip": "Sunteți administrator", + "account_basics_tier_paid_until": "Abonamentul este plătit până la {{date}}, și se va reînnoi automat", + "account_basics_tier_payment_overdue": "Plata dvs. este restantă. Actualizați metoda de plată sau contul dvs. va fi retrogradat în curând.", + "account_basics_tier_interval_yearly": "anual", + "account_basics_tier_upgrade_button": "Upgrade la Pro", + "account_basics_phone_numbers_title": "Numere de telefon", + "account_basics_password_description": "Schimbă parola contului", + "account_basics_password_dialog_confirm_password_label": "Confirmă parola", + "account_basics_password_dialog_button_submit": "Schimbă parola", + "account_basics_password_dialog_current_password_incorrect": "Parola este incorectă", + "account_basics_phone_numbers_dialog_description": "Pentru a folosi funcția de notificare prin apel, trebuie să adăugați și să verificați cel puțin un număr de telefon. Verificare poate fi făcută prin SMS sau apel vocal.", + "account_basics_phone_numbers_description": "Pentru notificări prin apel", + "account_basics_phone_numbers_dialog_verify_button_sms": "Trimite SMS", + "account_basics_phone_numbers_no_phone_numbers_yet": "Încă nu există numere de telefon", + "account_basics_phone_numbers_dialog_title": "Adaugă număr de telefon", + "account_basics_phone_numbers_dialog_number_label": "Număr de telefon", + "account_basics_phone_numbers_dialog_number_placeholder": "e.x. +1222333444", + "account_basics_phone_numbers_dialog_verify_button_call": "Sună-mă", + "account_basics_phone_numbers_dialog_code_label": "Cod de verificare", + "account_basics_phone_numbers_dialog_code_placeholder": "e.x. 123456", + "account_basics_phone_numbers_dialog_check_verification_button": "Confirmă codul", + "account_basics_phone_numbers_dialog_channel_sms": "SMS", + "account_basics_phone_numbers_dialog_channel_call": "Apel", + "account_usage_title": "Utilizare", + "account_usage_unlimited": "Nelimitat", + "account_usage_limits_reset_daily": "Limitele de utilizare sunt resetate zilnic la miezul nopții (UTC)", + "account_basics_tier_title": "Tip de cont", + "account_usage_of_limit": "din {{limit}}", + "account_basics_tier_admin": "Administrator", + "account_basics_tier_admin_suffix_with_tier": "(cu nivelul {{tier}})", + "account_basics_tier_admin_suffix_no_tier": "(niciun nivel)", + "account_basics_tier_basic": "De bază", + "account_basics_tier_change_button": "Schimbă", + "account_basics_password_dialog_new_password_label": "Parola nouă", + "account_basics_password_title": "Parolă", + "account_basics_tier_description": "Nivelul de putere al contului", + "account_basics_tier_free": "Gratuit" } From ac983cd9bc70b15bd2fffa9ad3b74b1fb2684434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=AE=A4=E0=AE=AE=E0=AE=BF=E0=AE=B4=E0=AF=8D=E0=AE=A8?= =?UTF-8?q?=E0=AF=87=E0=AE=B0=E0=AE=AE=E0=AF=8D?= Date: Tue, 21 Jan 2025 02:00:28 +0000 Subject: [PATCH 078/117] Translated using Weblate (Tamil) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ta/ --- web/public/static/langs/ta.json | 408 +++++++++++++++++++++++++++++++- 1 file changed, 407 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/ta.json b/web/public/static/langs/ta.json index 0967ef42..11635c91 100644 --- a/web/public/static/langs/ta.json +++ b/web/public/static/langs/ta.json @@ -1 +1,407 @@ -{} +{ + "action_bar_account": "கணக்கு", + "action_bar_change_display_name": "காட்சி பெயரை மாற்றவும்", + "action_bar_show_menu": "மெனுவைக் காட்டு", + "action_bar_logo_alt": "ntfy லோகோ", + "action_bar_settings": "அமைப்புகள்", + "action_bar_reservation_add": "இருப்பு தலைப்பு", + "message_bar_publish": "செய்தியை வெளியிடுங்கள்", + "nav_topics_title": "சந்தா தலைப்புகள்", + "nav_button_all_notifications": "அனைத்து அறிவிப்புகளும்", + "nav_button_account": "கணக்கு", + "nav_button_settings": "அமைப்புகள்", + "nav_button_documentation": "ஆவணப்படுத்துதல்", + "nav_button_publish_message": "அறிவிப்பை வெளியிடுங்கள்", + "alert_not_supported_description": "உங்கள் உலாவியில் அறிவிப்புகள் ஆதரிக்கப்படவில்லை", + "alert_not_supported_context_description": "அறிவிப்புகள் HTTP களில் மட்டுமே ஆதரிக்கப்படுகின்றன. இது அறிவிப்புகள் பநிஇ இன் வரம்பு.", + "notifications_list": "அறிவிப்புகள் பட்டியல்", + "notifications_delete": "நீக்கு", + "notifications_copied_to_clipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கப்பட்டது", + "notifications_list_item": "அறிவிப்பு", + "notifications_mark_read": "படித்தபடி குறி", + "notifications_tags": "குறிச்சொற்கள்", + "notifications_priority_x": "முன்னுரிமை {{priority}}", + "notifications_actions_not_supported": "வலை பயன்பாட்டில் நடவடிக்கை ஆதரிக்கப்படவில்லை", + "notifications_none_for_topic_title": "இந்த தலைப்புக்கு நீங்கள் இதுவரை எந்த அறிவிப்புகளையும் பெறவில்லை.", + "notifications_actions_http_request_title": "Http {{method}} {{url}} க்கு அனுப்பவும்", + "notifications_actions_failed_notification": "தோல்வியுற்ற செயல்", + "notifications_none_for_topic_description": "இந்த தலைப்புக்கு அறிவிப்புகளை அனுப்ப, தலைப்பு முகவரி க்கு வைக்கவும் அல்லது இடுகையிடவும்.", + "notifications_loading": "அறிவிப்புகளை ஏற்றுகிறது…", + "publish_dialog_title_topic": "{{topic}} க்கு வெளியிடுங்கள்", + "publish_dialog_title_no_topic": "அறிவிப்பை வெளியிடுங்கள்", + "publish_dialog_progress_uploading": "பதிவேற்றுதல்…", + "publish_dialog_message_published": "அறிவிப்பு வெளியிடப்பட்டது", + "publish_dialog_attachment_limits_file_and_quota_reached": "{{fileSizeLimit}} கோப்பு வரம்பு மற்றும் ஒதுக்கீடு, {{remainingBytes}} மீதமுள்ளது", + "publish_dialog_attachment_limits_file_reached": "{{fileSizeLimit}} கோப்பு வரம்பை மீறுகிறது", + "publish_dialog_attachment_limits_quota_reached": "ஒதுக்கீட்டை மீறுகிறது, {{remainingBytes}} மீதமுள்ளவை", + "publish_dialog_progress_uploading_detail": "பதிவேற்றுவது {{loaded}}/{{{total}} ({{percent}}%)…", + "publish_dialog_priority_min": "மணித்துளி. முன்னுரிமை", + "publish_dialog_emoji_picker_show": "ஈமோசியைத் தேர்ந்தெடுங்கள்", + "publish_dialog_priority_low": "குறைந்த முன்னுரிமை", + "publish_dialog_priority_default": "இயல்புநிலை முன்னுரிமை", + "publish_dialog_priority_high": "அதிக முன்னுரிமை", + "publish_dialog_priority_max": "அதிகபட்சம். முன்னுரிமை", + "publish_dialog_base_url_label": "பணி முகவரி", + "publish_dialog_base_url_placeholder": "பணி முகவரி, எ.கா. https://example.com", + "publish_dialog_topic_label": "தலைப்பு பெயர்", + "publish_dialog_topic_placeholder": "தலைப்பு பெயர், எ.கா. phil_alerts", + "publish_dialog_topic_reset": "தலைப்பை மீட்டமைக்கவும்", + "publish_dialog_title_label": "தலைப்பு", + "publish_dialog_title_placeholder": "அறிவிப்பு தலைப்பு, எ.கா. வட்டு விண்வெளி எச்சரிக்கை", + "publish_dialog_message_label": "செய்தி", + "publish_dialog_message_placeholder": "இங்கே ஒரு செய்தியைத் தட்டச்சு செய்க", + "publish_dialog_tags_label": "குறிச்சொற்கள்", + "publish_dialog_tags_placeholder": "குறிச்சொற்களின் கமாவால் பிரிக்கப்பட்ட பட்டியல், எ.கா. எச்சரிக்கை, SRV1-Backup", + "publish_dialog_priority_label": "முன்னுரிமை", + "publish_dialog_click_label": "முகவரி ஐக் சொடுக்கு செய்க", + "publish_dialog_click_placeholder": "அறிவிப்பைக் சொடுக்கு செய்யும் போது திறக்கப்படும் முகவரி", + "publish_dialog_click_reset": "சொடுக்கு முகவரி ஐ அகற்று", + "publish_dialog_email_label": "மின்னஞ்சல்", + "publish_dialog_email_placeholder": "அறிவிப்பை அனுப்ப முகவரி, எ.கா. phil@example.com", + "publish_dialog_email_reset": "மின்னஞ்சலை முன்னோக்கி அகற்றவும்", + "publish_dialog_call_label": "தொலைபேசி அழைப்பு", + "publish_dialog_call_item": "தொலைபேசி எண்ணை அழைக்கவும் {{number}}", + "publish_dialog_call_reset": "தொலைபேசி அழைப்பை அகற்று", + "publish_dialog_attach_label": "இணைப்பு முகவரி", + "publish_dialog_attach_placeholder": "முகவரி ஆல் கோப்பை இணைக்கவும், எ.கா. https://f-droid.org/f-droid.apk", + "publish_dialog_attach_reset": "இணைப்பு முகவரி ஐ அகற்று", + "publish_dialog_filename_label": "கோப்புப்பெயர்", + "publish_dialog_filename_placeholder": "இணைப்பு கோப்பு பெயர்", + "publish_dialog_delay_label": "சுணக்கம்", + "publish_dialog_delay_placeholder": "நேரந்தவறுகை வழங்கல், எ.கா. {{unixTimestamp}}, {{relativeTime}}, அல்லது \"{{naturalLanguage}}\" (ஆங்கிலம் மட்டும்)", + "publish_dialog_delay_reset": "தாமதமான விநியோகத்தை அகற்று", + "publish_dialog_other_features": "பிற அம்சங்கள்:", + "publish_dialog_chip_click_label": "முகவரி ஐக் சொடுக்கு செய்க", + "publish_dialog_chip_call_label": "தொலைபேசி அழைப்பு", + "publish_dialog_chip_email_label": "மின்னஞ்சலுக்கு அனுப்பவும்", + "publish_dialog_chip_call_no_verified_numbers_tooltip": "சரிபார்க்கப்பட்ட தொலைபேசி எண்கள் இல்லை", + "publish_dialog_chip_attach_url_label": "முகவரி மூலம் கோப்பை இணைக்கவும்", + "publish_dialog_details_examples_description": "எடுத்துக்காட்டுகள் மற்றும் அனைத்து அனுப்பும் அம்சங்களின் விரிவான விளக்கத்திற்கு, தயவுசெய்து ஆவணங்கள் ஐப் பார்க்கவும்.", + "publish_dialog_chip_attach_file_label": "உள்ளக கோப்பை இணைக்கவும்", + "publish_dialog_chip_delay_label": "நேரந்தவறுகை வழங்கல்", + "publish_dialog_chip_topic_label": "தலைப்பை மாற்றவும்", + "subscribe_dialog_subscribe_button_generate_topic_name": "பெயரை உருவாக்குங்கள்", + "subscribe_dialog_subscribe_use_another_background_info": "வலை பயன்பாடு திறக்கப்படாதபோது பிற சேவையகங்களிலிருந்து அறிவிப்புகள் பெறப்படாது", + "subscribe_dialog_subscribe_button_cancel": "ரத்துசெய்", + "subscribe_dialog_subscribe_button_subscribe": "குழுசேர்", + "subscribe_dialog_login_title": "உள்நுழைவு தேவை", + "account_basics_password_dialog_confirm_password_label": "கடவுச்சொல்லை உறுதிப்படுத்தவும்", + "account_basics_password_dialog_current_password_incorrect": "கடவுச்சொல் தவறானது", + "account_basics_password_dialog_button_submit": "கடவுச்சொல்லை மாற்றவும்", + "account_basics_phone_numbers_title": "தொலைபேசி எண்கள்", + "account_basics_phone_numbers_dialog_description": "அழைப்பு அறிவிப்பு அம்சத்தைப் பயன்படுத்த, நீங்கள் குறைந்தது ஒரு தொலைபேசி எண்ணையாவது சேர்த்து சரிபார்க்க வேண்டும். சரிபார்ப்பு எச்எம்எச் அல்லது தொலைபேசி அழைப்பு வழியாக செய்யப்படலாம்.", + "account_basics_phone_numbers_description": "தொலைபேசி அழைப்பு அறிவிப்புகளுக்கு", + "account_basics_phone_numbers_no_phone_numbers_yet": "தொலைபேசி எண்கள் இதுவரை இல்லை", + "account_basics_phone_numbers_copied_to_clipboard": "தொலைபேசி எண் இடைநிலைப்பலகைக்கு நகலெடுக்கப்பட்டது", + "account_basics_phone_numbers_dialog_title": "தொலைபேசி எண்ணைச் சேர்க்கவும்", + "account_basics_phone_numbers_dialog_number_placeholder": "எ.கா. +122333444", + "account_basics_phone_numbers_dialog_verify_button_sms": "எச்எம்எச் அனுப்பு", + "account_basics_phone_numbers_dialog_code_placeholder": "எ.கா. 123456", + "account_basics_phone_numbers_dialog_check_verification_button": "குறியீட்டை உறுதிப்படுத்தவும்", + "account_basics_phone_numbers_dialog_verify_button_call": "என்னை அழைக்கவும்", + "account_basics_phone_numbers_dialog_code_label": "சரிபார்ப்பு குறியீடு", + "account_basics_phone_numbers_dialog_channel_sms": "எச்.எம்.எச்", + "account_basics_phone_numbers_dialog_channel_call": "அழைப்பு", + "account_usage_title": "பயன்பாடு", + "account_usage_unlimited": "வரம்பற்றது", + "account_usage_of_limit": "{{limit}} of", + "account_usage_limits_reset_daily": "பயன்பாட்டு வரம்புகள் நள்ளிரவில் தினமும் மீட்டமைக்கப்படுகின்றன (UTC)", + "account_basics_tier_title": "கணக்கு வகை", + "account_basics_tier_description": "உங்கள் கணக்கின் ஆற்றல் நிலை", + "account_basics_tier_admin": "நிர்வாகி", + "account_basics_tier_admin_suffix_with_tier": "({{tier}} அடுக்கு)", + "account_basics_tier_admin_suffix_no_tier": "(அடுக்கு இல்லை)", + "account_basics_tier_basic": "அடிப்படை", + "account_basics_tier_free": "இலவசம்", + "account_basics_tier_interval_monthly": "மாதாந்திர", + "account_basics_tier_interval_yearly": "ஆண்டுதோறும்", + "account_basics_tier_upgrade_button": "சார்புக்கு மேம்படுத்தவும்", + "account_basics_tier_change_button": "மாற்றம்", + "account_basics_tier_paid_until": "சந்தா {{date}} வரை செலுத்தப்படுகிறது, மேலும் தானாக புதுப்பிக்கப்படும்", + "account_basics_tier_canceled_subscription": "உங்கள் சந்தா ரத்து செய்யப்பட்டது மற்றும் {{date} at இல் இலவச கணக்கிற்கு தரமிறக்கப்படும்.", + "account_basics_tier_manage_billing_button": "பட்டியலிடல் நிர்வகிக்கவும்", + "account_basics_tier_payment_overdue": "உங்கள் கட்டணம் தாமதமானது. தயவுசெய்து உங்கள் கட்டண முறையைப் புதுப்பிக்கவும், அல்லது உங்கள் கணக்கு விரைவில் தரமிறக்கப்படும்.", + "account_usage_messages_title": "வெளியிடப்பட்ட செய்திகள்", + "account_usage_emails_title": "மின்னஞ்சல்கள் அனுப்பப்பட்டன", + "account_usage_calls_title": "தொலைபேசி அழைப்புகள் செய்யப்பட்டன", + "account_usage_calls_none": "இந்த கணக்கில் தொலைபேசி அழைப்புகள் எதுவும் செய்ய முடியாது", + "account_usage_reservations_title": "ஒதுக்கப்பட்ட தலைப்புகள்", + "account_usage_reservations_none": "இந்த கணக்கிற்கு ஒதுக்கப்பட்ட தலைப்புகள் இல்லை", + "account_usage_attachment_storage_title": "இணைப்பு சேமிப்பு", + "account_usage_attachment_storage_description": "கோப்பு {{filesize}} க்குப் பிறகு நீக்கப்பட்ட ஒரு கோப்பிற்கு {{expiry}}}}", + "account_usage_basis_ip_description": "இந்த கணக்கிற்கான பயன்பாட்டு புள்ளிவிவரங்கள் மற்றும் வரம்புகள் உங்கள் ஐபி முகவரியை அடிப்படையாகக் கொண்டவை, எனவே அவை மற்ற பயனர்களுடன் பகிரப்படலாம். மேலே காட்டப்பட்டுள்ள வரம்புகள் தற்போதுள்ள விகித வரம்புகளின் அடிப்படையில் தோராயங்கள்.", + "account_usage_cannot_create_portal_session": "பட்டியலிடல் போர்ட்டலைத் திறக்க முடியவில்லை", + "account_delete_title": "கணக்கை நீக்கு", + "account_delete_description": "உங்கள் கணக்கை நிரந்தரமாக நீக்கவும்", + "account_upgrade_dialog_cancel_warning": "இது உங்கள் சந்தாவை ரத்துசெய்யும் , மேலும் உங்கள் கணக்கை {{date} at இல் தரமிறக்குகிறது. அந்த தேதியில், தலைப்பு முன்பதிவு மற்றும் சேவையகத்தில் தற்காலிகமாக சேமிக்கப்பட்ட செய்திகளும் நீக்கப்படும் .", + "account_upgrade_dialog_proration_info": " புரோரேசன் : கட்டணத் திட்டங்களுக்கு இடையில் மேம்படுத்தும்போது, விலை வேறுபாடு உடனடியாக கட்டணம் வசூலிக்கப்படும் . குறைந்த அடுக்குக்கு தரமிறக்கும்போது, எதிர்கால பட்டியலிடல் காலங்களுக்கு செலுத்த இருப்பு பயன்படுத்தப்படும்.", + "account_upgrade_dialog_reservations_warning_one": "தேர்ந்தெடுக்கப்பட்ட அடுக்கு உங்கள் தற்போதைய அடுக்கை விட குறைவான ஒதுக்கப்பட்ட தலைப்புகளை அனுமதிக்கிறது. உங்கள் அடுக்கை மாற்றுவதற்கு முன், தயவுசெய்து குறைந்தது ஒரு முன்பதிவை நீக்கு . <இணைப்பு> அமைப்புகள் இல் முன்பதிவுகளை அகற்றலாம்.", + "account_upgrade_dialog_reservations_warning_other": "தேர்ந்தெடுக்கப்பட்ட அடுக்கு உங்கள் தற்போதைய அடுக்கை விட குறைவான ஒதுக்கப்பட்ட தலைப்புகளை அனுமதிக்கிறது. உங்கள் அடுக்கை மாற்றுவதற்கு முன், தயவுசெய்து குறைந்தபட்சம் {{count}} முன்பதிவு ஐ நீக்கவும். <இணைப்பு> அமைப்புகள் இல் முன்பதிவுகளை அகற்றலாம்.", + "account_upgrade_dialog_tier_features_reservations_other": "{{reservations}} ஒதுக்கப்பட்ட தலைப்புகள்", + "account_upgrade_dialog_tier_features_no_reservations": "ஒதுக்கப்பட்ட தலைப்புகள் இல்லை", + "account_upgrade_dialog_tier_features_messages_one": "{{messages}} நாள்தோறும் செய்தி", + "account_upgrade_dialog_tier_features_messages_other": "{{messages}} நாள்தோறும் செய்திகள்", + "account_upgrade_dialog_tier_features_emails_one": "{{emails}} நாள்தோறும் மின்னஞ்சல்", + "account_upgrade_dialog_tier_features_emails_other": "{{emails}} நாள்தோறும் மின்னஞ்சல்கள்", + "account_upgrade_dialog_tier_features_calls_one": "{{calls}} நாள்தோறும் தொலைபேசி அழைப்புகள்", + "account_upgrade_dialog_tier_features_calls_other": "{{calls}} நாள்தோறும் தொலைபேசி அழைப்புகள்", + "account_upgrade_dialog_tier_features_attachment_total_size": "{{totalsize}} மொத்த சேமிப்பு", + "account_upgrade_dialog_tier_price_per_month": "மாதம்", + "account_upgrade_dialog_tier_price_billed_monthly": "{{price}}}}}}. மாதந்தோறும் பாடு.", + "account_upgrade_dialog_tier_features_no_calls": "தொலைபேசி அழைப்புகள் இல்லை", + "account_upgrade_dialog_tier_features_attachment_file_size": "கோப்பு {filesize}}} ஒரு கோப்பிற்கு", + "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} ஆண்டுதோறும் கட்டணம் செலுத்தப்படுகிறது. {{save}} சேமி.", + "account_upgrade_dialog_tier_selected_label": "தேர்ந்தெடுக்கப்பட்டது", + "account_upgrade_dialog_tier_current_label": "மின்னோட்ட்ம், ஓட்டம்", + "account_upgrade_dialog_billing_contact_email": "பட்டியலிடல் கேள்விகளுக்கு, தயவுசெய்து <இணைப்பு> எங்களை தொடர்பு கொள்ளவும் நேரடியாக.", + "account_upgrade_dialog_button_cancel": "ரத்துசெய்", + "account_upgrade_dialog_billing_contact_website": "பட்டியலிடல் கேள்விகளுக்கு, தயவுசெய்து எங்கள் <இணைப்பு> வலைத்தளம் ஐப் பார்க்கவும்.", + "account_upgrade_dialog_button_redirect_signup": "இப்போது பதிவுபெறுக", + "account_upgrade_dialog_button_pay_now": "இப்போது பணம் செலுத்தி குழுசேரவும்", + "account_upgrade_dialog_button_cancel_subscription": "சந்தாவை ரத்துசெய்", + "account_tokens_title": "டோக்கன்களை அணுகவும்", + "account_tokens_description": "NTFY பநிஇ வழியாக வெளியிடும் மற்றும் சந்தா செலுத்தும் போது அணுகல் டோக்கன்களைப் பயன்படுத்தவும், எனவே உங்கள் கணக்கு நற்சான்றிதழ்களை அனுப்ப வேண்டியதில்லை. மேலும் அறிய <இணைப்பு> ஆவணங்கள் ஐப் பாருங்கள்.", + "account_upgrade_dialog_button_update_subscription": "சந்தாவைப் புதுப்பிக்கவும்", + "account_tokens_table_token_header": "கிள்ளாக்கு", + "account_tokens_table_label_header": "சிட்டை", + "account_tokens_table_last_access_header": "கடைசி அணுகல்", + "account_tokens_table_expires_header": "காலாவதியாகிறது", + "account_tokens_table_never_expires": "ஒருபோதும் காலாவதியாகாது", + "account_tokens_table_cannot_delete_or_edit": "தற்போதைய அமர்வு டோக்கனைத் திருத்தவோ நீக்கவோ முடியாது", + "account_tokens_table_current_session": "தற்போதைய உலாவி அமர்வு", + "account_tokens_table_copied_to_clipboard": "அணுகல் கிள்ளாக்கு நகலெடுக்கப்பட்டது", + "account_tokens_table_create_token_button": "அணுகல் கிள்ளாக்கை உருவாக்கவும்", + "account_tokens_dialog_title_create": "அணுகல் கிள்ளாக்கை உருவாக்கவும்", + "account_tokens_table_last_origin_tooltip": "ஐபி முகவரி {{ip} இருந்து இலிருந்து, தேடலைக் சொடுக்கு செய்க", + "account_tokens_dialog_title_edit": "அணுகல் டோக்கனைத் திருத்தவும்", + "account_tokens_dialog_title_delete": "அணுகல் கிள்ளாக்கை நீக்கு", + "account_tokens_dialog_label": "சிட்டை, எ.கா. ராடார் அறிவிப்புகள்", + "account_tokens_dialog_button_create": "கிள்ளாக்கை உருவாக்கவும்", + "account_tokens_dialog_button_update": "கிள்ளாக்கைப் புதுப்பிக்கவும்", + "account_tokens_dialog_button_cancel": "ரத்துசெய்", + "account_tokens_dialog_expires_label": "அணுகல் கிள்ளாக்கு காலாவதியாகிறது", + "account_tokens_dialog_expires_unchanged": "காலாவதி தேதி மாறாமல் விடுங்கள்", + "account_tokens_dialog_expires_x_hours": "கிள்ளாக்கு {{hours}} மணிநேரங்களில் காலாவதியாகிறது", + "account_tokens_dialog_expires_x_days": "கிள்ளாக்கு {{days}} நாட்களில் காலாவதியாகிறது", + "account_tokens_dialog_expires_never": "கிள்ளாக்கு ஒருபோதும் காலாவதியாகாது", + "account_tokens_delete_dialog_title": "அணுகல் கிள்ளாக்கை நீக்கு", + "account_tokens_delete_dialog_description": "அணுகல் கிள்ளாக்கை நீக்குவதற்கு முன், பயன்பாடுகள் அல்லது ச்கிரிப்ட்கள் எதுவும் தீவிரமாகப் பயன்படுத்தவில்லை என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள். இந்த செயலை செயல்தவிர்க்க முடியாது .", + "account_tokens_delete_dialog_submit_button": "கிள்ளாக்கை நிரந்தரமாக நீக்கு", + "prefs_notifications_title": "அறிவிப்புகள்", + "prefs_notifications_sound_title": "அறிவிப்பு ஒலி", + "prefs_notifications_sound_description_none": "அறிவிப்புகள் வரும்போது எந்த ஒலியையும் இயக்காது", + "prefs_notifications_sound_description_some": "அறிவிப்புகள் வரும்போது {{sound}} ஒலியை இயக்குகின்றன", + "prefs_notifications_sound_no_sound": "ஒலி இல்லை", + "prefs_notifications_sound_play": "தேர்ந்தெடுக்கப்பட்ட ஒலி விளையாடுங்கள்", + "prefs_notifications_min_priority_title": "குறைந்தபட்ச முன்னுரிமை", + "prefs_notifications_min_priority_description_any": "முன்னுரிமையைப் பொருட்படுத்தாமல் அனைத்து அறிவிப்புகளையும் காட்டுகிறது", + "prefs_notifications_min_priority_description_x_or_higher": "முன்னுரிமை {{number}} ({{name}}) அல்லது அதற்கு மேல் இருந்தால் அறிவிப்புகளைக் காட்டு", + "prefs_notifications_min_priority_description_max": "முன்னுரிமை 5 (அதிகபட்சம்) என்றால் அறிவிப்புகளைக் காட்டு", + "prefs_notifications_min_priority_any": "எந்த முன்னுரிமையும்", + "prefs_notifications_min_priority_low_and_higher": "குறைந்த முன்னுரிமை மற்றும் அதிக", + "prefs_notifications_min_priority_default_and_higher": "இயல்புநிலை முன்னுரிமை மற்றும் அதிக", + "prefs_notifications_min_priority_high_and_higher": "அதிக முன்னுரிமை மற்றும் அதிக", + "prefs_notifications_min_priority_max_only": "அதிகபட்ச முன்னுரிமை மட்டுமே", + "prefs_notifications_delete_after_title": "அறிவிப்புகளை நீக்கு", + "prefs_notifications_delete_after_never": "ஒருபோதும்", + "prefs_notifications_delete_after_three_hours": "மூன்று மணி நேரம் கழித்து", + "prefs_notifications_delete_after_one_day": "ஒரு நாள் கழித்து", + "prefs_notifications_delete_after_one_week": "ஒரு வாரம் கழித்து", + "prefs_notifications_delete_after_one_month": "ஒரு மாதத்திற்குப் பிறகு", + "prefs_notifications_delete_after_never_description": "அறிவிப்புகள் ஒருபோதும் தானாக நீக்கப்படவில்லை", + "prefs_notifications_delete_after_three_hours_description": "அறிவிப்புகள் மூன்று மணி நேரத்திற்குப் பிறகு தானாக நீக்கப்படும்", + "prefs_notifications_delete_after_one_day_description": "அறிவிப்புகள் ஒரு நாளுக்குப் பிறகு தானாக நீக்கப்படும்", + "prefs_notifications_delete_after_one_week_description": "அறிவிப்புகள் ஒரு வாரத்திற்குப் பிறகு தானாக நீக்கப்படும்", + "prefs_notifications_delete_after_one_month_description": "அறிவிப்புகள் ஒரு மாதத்திற்குப் பிறகு தானாக நீக்கப்படும்", + "prefs_notifications_web_push_title": "பின்னணி அறிவிப்புகள்", + "prefs_notifications_web_push_enabled_description": "வலை பயன்பாடு இயங்காதபோது கூட அறிவிப்புகள் பெறப்படுகின்றன (வலை புச் வழியாக)", + "prefs_notifications_web_push_disabled_description": "வலை பயன்பாடு இயங்கும்போது அறிவிப்பு பெறப்படுகிறது (வெப்சாக்கெட் வழியாக)", + "prefs_notifications_web_push_enabled": "{{server} க்கு க்கு இயக்கப்பட்டது", + "prefs_notifications_web_push_disabled": "முடக்கப்பட்டது", + "prefs_users_title": "பயனர்களை நிர்வகிக்கவும்", + "prefs_users_description": "உங்கள் பாதுகாக்கப்பட்ட தலைப்புகளுக்கு பயனர்களை இங்கே சேர்க்கவும்/அகற்றவும். பயனர்பெயர் மற்றும் கடவுச்சொல் உலாவியின் உள்ளக சேமிப்பகத்தில் சேமிக்கப்பட்டுள்ளன என்பதை நினைவில் கொள்க.", + "prefs_users_description_no_sync": "பயனர்கள் மற்றும் கடவுச்சொற்கள் உங்கள் கணக்கில் ஒத்திசைக்கப்படவில்லை.", + "prefs_users_table": "பயனர்கள் அட்டவணை", + "prefs_users_edit_button": "பயனரைத் திருத்து", + "prefs_users_delete_button": "பயனரை நீக்கு", + "prefs_users_table_cannot_delete_or_edit": "உள்நுழைந்த பயனரை நீக்கவோ திருத்தவோ முடியாது", + "prefs_users_table_user_header": "பயனர்", + "prefs_users_table_base_url_header": "பணி முகவரி", + "prefs_users_dialog_title_add": "பயனரைச் சேர்க்கவும்", + "prefs_users_dialog_title_edit": "பயனரைத் திருத்து", + "prefs_users_dialog_base_url_label": "பணி முகவரி, எ.கா. https://ntfy.sh", + "prefs_users_dialog_username_label": "பயனர்பெயர், எ.கா. பில்", + "prefs_users_dialog_password_label": "கடவுச்சொல்", + "prefs_appearance_title": "தோற்றம்", + "prefs_appearance_language_title": "மொழி", + "prefs_appearance_theme_title": "கருப்பொருள்", + "prefs_appearance_theme_system": "கணினி (இயல்புநிலை)", + "prefs_appearance_theme_dark": "இருண்ட முறை", + "prefs_appearance_theme_light": "ஒளி பயன்முறை", + "prefs_reservations_title": "ஒதுக்கப்பட்ட தலைப்புகள்", + "prefs_reservations_description": "தனிப்பட்ட பயன்பாட்டிற்காக தலைப்பு பெயர்களை இங்கே முன்பதிவு செய்யலாம். ஒரு தலைப்பை முன்பதிவு செய்வது தலைப்பின் மீது உங்களுக்கு உரிமையை அளிக்கிறது, மேலும் தலைப்பில் பிற பயனர்களுக்கான அணுகல் அனுமதிகளை வரையறுக்க உங்களை அனுமதிக்கிறது.", + "prefs_reservations_limit_reached": "உங்கள் ஒதுக்கப்பட்ட தலைப்புகளின் வரம்பை நீங்கள் அடைந்தீர்கள்.", + "prefs_reservations_add_button": "ஒதுக்கப்பட்ட தலைப்பைச் சேர்க்கவும்", + "prefs_reservations_edit_button": "தலைப்பு அணுகலைத் திருத்தவும்", + "prefs_reservations_delete_button": "தலைப்பு அணுகலை மீட்டமைக்கவும்", + "prefs_reservations_table": "ஒதுக்கப்பட்ட தலைப்புகள் அட்டவணை", + "prefs_reservations_table_topic_header": "தலைப்பு", + "prefs_reservations_table_access_header": "அணுகல்", + "prefs_reservations_table_everyone_deny_all": "நான் மட்டுமே வெளியிட்டு குழுசேர முடியும்", + "prefs_reservations_table_everyone_read_only": "நான் வெளியிட்டு குழுசேரலாம், அனைவரும் குழுசேரலாம்", + "prefs_reservations_table_everyone_write_only": "நான் வெளியிட்டு குழுசேரலாம், எல்லோரும் வெளியிடலாம்", + "prefs_reservations_table_everyone_read_write": "எல்லோரும் வெளியிட்டு குழுசேரலாம்", + "prefs_reservations_table_not_subscribed": "குழுசேரவில்லை", + "prefs_reservations_table_click_to_subscribe": "குழுசேர சொடுக்கு செய்க", + "prefs_reservations_dialog_title_add": "இருப்பு தலைப்பு", + "prefs_reservations_dialog_title_edit": "ஒதுக்கப்பட்ட தலைப்பைத் திருத்து", + "prefs_reservations_dialog_title_delete": "தலைப்பு முன்பதிவை நீக்கு", + "prefs_reservations_dialog_description": "ஒரு தலைப்பை முன்பதிவு செய்வது தலைப்பின் மீது உங்களுக்கு உரிமையை அளிக்கிறது, மேலும் தலைப்பில் பிற பயனர்களுக்கான அணுகல் அனுமதிகளை வரையறுக்க உங்களை அனுமதிக்கிறது.", + "prefs_reservations_dialog_topic_label": "தலைப்பு", + "prefs_reservations_dialog_access_label": "அணுகல்", + "reservation_delete_dialog_description": "முன்பதிவை அகற்றுவது தலைப்பின் மீது உரிமையை அளிக்கிறது, மேலும் மற்றவர்கள் அதை முன்பதிவு செய்ய அனுமதிக்கிறது. ஏற்கனவே உள்ள செய்திகளையும் இணைப்புகளையும் வைத்திருக்கலாம் அல்லது நீக்கலாம்.", + "reservation_delete_dialog_action_keep_title": "தற்காலிக சேமிப்பு செய்திகள் மற்றும் இணைப்புகளை வைத்திருங்கள்", + "reservation_delete_dialog_action_keep_description": "சேவையகத்தில் தற்காலிக சேமிப்பில் உள்ள செய்திகள் மற்றும் இணைப்புகள் தலைப்புப் பெயரைப் பற்றிய அறிவுள்ளவர்களுக்கு பகிரங்கமாகத் தெரியும்.", + "reservation_delete_dialog_action_delete_title": "தற்காலிக சேமிப்பு செய்திகள் மற்றும் இணைப்புகளை நீக்கவும்", + "reservation_delete_dialog_submit_button": "முன்பதிவை நீக்கு", + "reservation_delete_dialog_action_delete_description": "தற்காலிக சேமிக்கப்பட்ட செய்திகள் மற்றும் இணைப்புகள் நிரந்தரமாக நீக்கப்படும். இந்த செயலை செயல்தவிர்க்க முடியாது.", + "priority_min": "மணித்துளி", + "priority_low": "குறைந்த", + "priority_high": "உயர்ந்த", + "priority_max": "அதிகபட்சம்", + "priority_default": "இயல்புநிலை", + "error_boundary_title": "ஓ, NTFY செயலிழந்தது", + "error_boundary_description": "இது வெளிப்படையாக நடக்கக்கூடாது. இதைப் பற்றி மிகவும் வருந்துகிறேன். .", + "error_boundary_button_copy_stack_trace": "அடுக்கு சுவடு நகலெடுக்கவும்", + "error_boundary_button_reload_ntfy": "Ntfy ஐ மீண்டும் ஏற்றவும்", + "error_boundary_stack_trace": "ச்டாக் சுவடு", + "error_boundary_gathering_info": "மேலும் தகவலை சேகரிக்கவும்…", + "error_boundary_unsupported_indexeddb_title": "தனியார் உலாவல் ஆதரிக்கப்படவில்லை", + "common_cancel": "ரத்துசெய்", + "common_save": "சேமி", + "common_add": "கூட்டு", + "common_back": "பின்", + "common_copy_to_clipboard": "இடைநிலைப்பலகைக்கு நகலெடுக்கவும்", + "signup_title": "ஒரு NTFY கணக்கை உருவாக்கவும்", + "signup_form_username": "பயனர்பெயர்", + "signup_form_password": "கடவுச்சொல்", + "signup_form_confirm_password": "கடவுச்சொல்லை உறுதிப்படுத்தவும்", + "signup_form_button_submit": "பதிவு செய்க", + "signup_form_toggle_password_visibility": "கடவுச்சொல் தெரிவுநிலையை மாற்றவும்", + "signup_already_have_account": "ஏற்கனவே ஒரு கணக்கு இருக்கிறதா? உள்நுழைக!", + "signup_disabled": "கையொப்பம் முடக்கப்பட்டுள்ளது", + "signup_error_username_taken": "பயனர்பெயர் {{username}} ஏற்கனவே எடுக்கப்பட்டுள்ளது", + "signup_error_creation_limit_reached": "கணக்கு உருவாக்கும் வரம்பு எட்டப்பட்டது", + "login_title": "உங்கள் NTFY கணக்கில் உள்நுழைக", + "login_form_button_submit": "விடுபதிகை", + "login_link_signup": "பதிவு செய்க", + "login_disabled": "உள்நுழைவு முடக்கப்பட்டுள்ளது", + "action_bar_reservation_edit": "முன்பதிவை மாற்றவும்", + "action_bar_reservation_delete": "முன்பதிவை அகற்று", + "action_bar_reservation_limit_reached": "வரம்பு எட்டப்பட்டது", + "action_bar_send_test_notification": "சோதனை அறிவிப்பை அனுப்பவும்", + "action_bar_clear_notifications": "எல்லா அறிவிப்புகளையும் அழிக்கவும்", + "action_bar_mute_notifications": "முடக்கு அறிவிப்புகள்", + "action_bar_unmute_notifications": "ஊடுருவல் அறிவிப்புகள்", + "action_bar_unsubscribe": "குழுவிலகவும்", + "action_bar_toggle_mute": "முடக்கு/அசைவது அறிவிப்புகள்", + "action_bar_toggle_action_menu": "செயல் மெனுவைத் திறக்க/மூடு", + "action_bar_profile_title": "சுயவிவரம்", + "action_bar_profile_settings": "அமைப்புகள்", + "action_bar_profile_logout": "வெளியேற்றம்", + "action_bar_sign_in": "விடுபதிகை", + "action_bar_sign_up": "பதிவு செய்க", + "message_bar_type_message": "இங்கே ஒரு செய்தியைத் தட்டச்சு செய்க", + "message_bar_error_publishing": "பிழை வெளியீட்டு அறிவிப்பு", + "message_bar_show_dialog": "வெளியீட்டு உரையாடலைக் காட்டு", + "nav_button_subscribe": "தலைப்புக்கு குழுசேரவும்", + "nav_button_muted": "அறிவிப்புகள் முடக்கப்பட்டன", + "nav_button_connecting": "இணைத்தல்", + "nav_upgrade_banner_label": "Ntfy Pro க்கு மேம்படுத்தவும்", + "nav_upgrade_banner_description": "தலைப்புகள், கூடுதல் செய்திகள் மற்றும் மின்னஞ்சல்கள் மற்றும் பெரிய இணைப்புகளை முன்பதிவு செய்யுங்கள்", + "alert_notification_permission_required_title": "அறிவிப்புகள் முடக்கப்பட்டுள்ளன", + "alert_notification_permission_required_description": "டெச்க்டாப் அறிவிப்புகளைக் காண்பிக்க உங்கள் உலாவி இசைவு வழங்கவும்", + "alert_notification_permission_required_button": "இப்போது வழங்கவும்", + "alert_notification_permission_denied_title": "அறிவிப்புகள் தடுக்கப்பட்டுள்ளன", + "alert_notification_permission_denied_description": "தயவுசெய்து அவற்றை உங்கள் உலாவியில் மீண்டும் இயக்கவும்", + "alert_notification_ios_install_required_title": "ஐஇமு நிறுவல் தேவை", + "alert_notification_ios_install_required_description": "ஐஇமு இல் அறிவிப்புகளை இயக்க பகிர்வு ஐகானைக் சொடுக்கு செய்து முகப்புத் திரையில் சேர்க்கவும்", + "alert_not_supported_title": "அறிவிப்புகள் ஆதரிக்கப்படவில்லை", + "notifications_new_indicator": "புதிய அறிவிப்பு", + "notifications_attachment_image": "இணைப்பு படம்", + "notifications_attachment_copy_url_title": "இணைப்பு முகவரி ஐ இடைநிலைப்பலகைக்கு நகலெடுக்கவும்", + "notifications_attachment_copy_url_button": "முகவரி ஐ நகலெடுக்கவும்", + "notifications_attachment_open_title": "{{url}} க்குச் செல்லவும்", + "notifications_attachment_open_button": "திறந்த இணைப்பு", + "notifications_attachment_link_expires": "இணைப்பு காலாவதியாகிறது {{date}}", + "notifications_attachment_link_expired": "இணைப்பு காலாவதியான பதிவிறக்க", + "notifications_attachment_file_image": "பட கோப்பு", + "notifications_attachment_file_video": "வீடியோ கோப்பு", + "notifications_attachment_file_audio": "ஆடியோ கோப்பு", + "notifications_attachment_file_app": "ஆண்ட்ராய்டு பயன்பாட்டு கோப்பு", + "notifications_attachment_file_document": "பிற ஆவணம்", + "notifications_click_copy_url_title": "இடைநிலைப்பலகைக்கு இணைப்பு முகவரி ஐ நகலெடுக்கவும்", + "notifications_click_copy_url_button": "இணைப்பை நகலெடுக்கவும்", + "notifications_click_open_button": "இணைப்பை திற", + "notifications_actions_open_url_title": "{{url}} க்குச் செல்லவும்", + "notifications_none_for_any_title": "உங்களுக்கு எந்த அறிவிப்புகளும் கிடைக்கவில்லை.", + "notifications_none_for_any_description": "ஒரு தலைப்புக்கு அறிவிப்புகளை அனுப்ப, தலைப்பு முகவரி க்கு வைக்கவும் அல்லது இடுகையிடவும். உங்கள் தலைப்புகளில் ஒன்றைப் பயன்படுத்தி இங்கே ஒரு எடுத்துக்காட்டு.", + "notifications_no_subscriptions_title": "உங்களிடம் இன்னும் சந்தாக்கள் இல்லை என்று தெரிகிறது.", + "notifications_no_subscriptions_description": "ஒரு தலைப்பை உருவாக்க அல்லது குழுசேர \"{{linktext}}\" இணைப்பைக் சொடுக்கு செய்க. அதன்பிறகு, நீங்கள் புட் அல்லது இடுகை வழியாக செய்திகளை அனுப்பலாம், மேலும் நீங்கள் இங்கே அறிவிப்புகளைப் பெறுவீர்கள்.", + "notifications_example": "எடுத்துக்காட்டு", + "notifications_more_details": "மேலும் தகவலுக்கு, வலைத்தளம் அல்லது ஆவணங்கள் ஐப் பாருங்கள்.", + "display_name_dialog_title": "காட்சி பெயரை மாற்றவும்", + "display_name_dialog_description": "சந்தா பட்டியலில் காட்டப்படும் தலைப்புக்கு மாற்று பெயரை அமைக்கவும். சிக்கலான பெயர்களைக் கொண்ட தலைப்புகளை மிக எளிதாக அடையாளம் காண இது உதவுகிறது.", + "display_name_dialog_placeholder": "காட்சி பெயர்", + "reserve_dialog_checkbox_label": "தலைப்பை முன்பதிவு செய்து அணுகலை உள்ளமைக்கவும்", + "publish_dialog_button_cancel_sending": "அனுப்புவதை ரத்துசெய்", + "publish_dialog_button_cancel": "ரத்துசெய்", + "publish_dialog_button_send": "அனுப்பு", + "publish_dialog_checkbox_markdown": "மார்க் பேரூர் என வடிவம்", + "publish_dialog_checkbox_publish_another": "மற்றொன்றை வெளியிடுங்கள்", + "publish_dialog_attached_file_title": "இணைக்கப்பட்ட கோப்பு:", + "publish_dialog_attached_file_filename_placeholder": "இணைப்பு கோப்பு பெயர்", + "publish_dialog_attached_file_remove": "இணைக்கப்பட்ட கோப்பை அகற்று", + "publish_dialog_drop_file_here": "கோப்பை இங்கே விடுங்கள்", + "emoji_picker_search_placeholder": "ஈமோசியைத் தேடுங்கள்", + "emoji_picker_search_clear": "தேடலை அழி", + "subscribe_dialog_subscribe_title": "தலைப்புக்கு குழுசேரவும்", + "subscribe_dialog_subscribe_description": "தலைப்புகள் கடவுச்சொல் பாதுகாக்கப்பட்டதாக இருக்காது, எனவே யூகிக்க எளிதான பெயரைத் தேர்வுசெய்க. சந்தா செலுத்தியதும், நீங்கள் அறிவிப்புகளை வைக்கலாம்/இடுகையிடலாம்.", + "subscribe_dialog_subscribe_topic_placeholder": "தலைப்பு பெயர், எ.கா. phil_alerts", + "subscribe_dialog_subscribe_use_another_label": "மற்றொரு சேவையகத்தைப் பயன்படுத்தவும்", + "subscribe_dialog_subscribe_base_url_label": "பணி முகவரி", + "subscribe_dialog_login_description": "இந்த தலைப்பு கடவுச்சொல் பாதுகாக்கப்படுகிறது. குழுசேர பயனர்பெயர் மற்றும் கடவுச்சொல்லை உள்ளிடவும்.", + "subscribe_dialog_login_username_label": "பயனர்பெயர், எ.கா. பில்", + "subscribe_dialog_login_password_label": "கடவுச்சொல்", + "subscribe_dialog_login_button_login": "புகுபதிவு", + "subscribe_dialog_error_user_not_authorized": "பயனர் {{username}} அங்கீகரிக்கப்படவில்லை", + "subscribe_dialog_error_topic_already_reserved": "தலைப்பு ஏற்கனவே ஒதுக்கப்பட்டுள்ளது", + "subscribe_dialog_error_user_anonymous": "அநாமதேய", + "account_basics_title": "கணக்கு", + "account_basics_username_title": "பயனர்பெயர்", + "account_basics_username_description": "ஏய், அது நீங்கள் தான்", + "account_basics_username_admin_tooltip": "நீங்கள் நிர்வாகி", + "account_basics_password_title": "கடவுச்சொல்", + "account_basics_password_description": "உங்கள் கணக்கு கடவுச்சொல்லை மாற்றவும்", + "account_basics_password_dialog_title": "கடவுச்சொல்லை மாற்றவும்", + "account_basics_password_dialog_current_password_label": "தற்போதைய கடவுச்சொல்", + "account_basics_password_dialog_new_password_label": "புதிய கடவுச்சொல்", + "account_basics_phone_numbers_dialog_number_label": "தொலைபேசி எண்", + "account_delete_dialog_description": "இது சேவையகத்தில் சேமிக்கப்பட்டுள்ள அனைத்து தரவுகளும் உட்பட உங்கள் கணக்கை நிரந்தரமாக நீக்கும். நீக்கப்பட்ட பிறகு, உங்கள் பயனர்பெயர் 7 நாட்களுக்கு கிடைக்காது. நீங்கள் உண்மையிலேயே தொடர விரும்பினால், கீழே உள்ள பெட்டியில் உங்கள் கடவுச்சொல்லை உறுதிப்படுத்தவும்.", + "account_delete_dialog_label": "கடவுச்சொல்", + "account_delete_dialog_button_cancel": "ரத்துசெய்", + "account_delete_dialog_button_submit": "கணக்கை நிரந்தரமாக நீக்கு", + "account_delete_dialog_billing_warning": "உங்கள் கணக்கை நீக்குவது உடனடியாக உங்கள் பட்டியலிடல் சந்தாவை ரத்து செய்கிறது. உங்களுக்கு இனி பட்டியலிடல் டாச்போர்டுக்கு அணுகல் இருக்காது.", + "account_upgrade_dialog_title": "கணக்கு அடுக்கை மாற்றவும்", + "account_upgrade_dialog_interval_monthly": "மாதாந்திர", + "account_upgrade_dialog_interval_yearly": "ஆண்டுதோறும்", + "account_upgrade_dialog_interval_yearly_discount_save": "{{discount}}% சேமிக்கவும்", + "account_upgrade_dialog_interval_yearly_discount_save_up_to": "{{discount}}% வரை சேமிக்கவும்", + "account_upgrade_dialog_tier_features_reservations_one": "{{reservations}} முன்பதிவு செய்யப்பட்ட தலைப்பு", + "prefs_users_add_button": "பயனரைச் சேர்க்கவும்", + "error_boundary_unsupported_indexeddb_description": "NTFY வலை பயன்பாட்டிற்கு செயல்பட குறியீட்டு தேவை, மற்றும் உங்கள் உலாவி தனிப்பட்ட உலாவல் பயன்முறையில் IndexEDDB ஐ ஆதரிக்காது. எப்படியிருந்தாலும் தனிப்பட்ட உலாவல் பயன்முறையில் பயன்பாடு, ஏனென்றால் அனைத்தும் உலாவி சேமிப்பகத்தில் சேமிக்கப்படுகின்றன. இந்த அறிவிலிமையம் இதழில் இல் பற்றி நீங்கள் மேலும் படிக்கலாம் அல்லது டிச்கார்ட் அல்லது மேட்ரிக்ச் இல் எங்களுடன் பேசலாம்.", + "web_push_subscription_expiring_title": "அறிவிப்புகள் இடைநிறுத்தப்படும்", + "web_push_subscription_expiring_body": "தொடர்ந்து அறிவிப்புகளைப் பெற NTFY ஐத் திறக்கவும்", + "web_push_unknown_notification_title": "சேவையகத்திலிருந்து அறியப்படாத அறிவிப்பு பெறப்பட்டது", + "web_push_unknown_notification_body": "வலை பயன்பாட்டைத் திறப்பதன் மூலம் நீங்கள் NTFY ஐ புதுப்பிக்க வேண்டியிருக்கலாம்" +} From f31d777b69bb103dad147f65c261af5e425d8b27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 6 Feb 2025 17:48:07 +0000 Subject: [PATCH 079/117] Translated using Weblate (Estonian) Currently translated at 10.6% (43 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/et/ --- web/public/static/langs/et.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/et.json b/web/public/static/langs/et.json index 65bfa6bc..11af0335 100644 --- a/web/public/static/langs/et.json +++ b/web/public/static/langs/et.json @@ -22,5 +22,24 @@ "common_add": "Lisa", "signup_form_button_submit": "Liitu", "signup_form_toggle_password_visibility": "Vaheta salasõna nähtavust", - "action_bar_account": "Kasutajakonto" + "action_bar_account": "Kasutajakonto", + "action_bar_sign_in": "Logi sisse", + "nav_button_documentation": "Dokumentatsioon", + "action_bar_profile_title": "Profiil", + "action_bar_profile_settings": "Seadistused", + "action_bar_sign_up": "Liitu", + "message_bar_type_message": "Sisesta oma sõnum siia", + "message_bar_error_publishing": "Viga teavituse avaldamisel", + "message_bar_show_dialog": "Näita avaldamisvaadet", + "message_bar_publish": "Avalda sõnum", + "nav_topics_title": "Tellitud teemad", + "nav_button_all_notifications": "Kõik teavitused", + "nav_button_account": "Kasutajakonto", + "nav_button_settings": "Seadistused", + "nav_button_publish_message": "Avalda teavitus", + "nav_button_subscribe": "Telli teema", + "nav_button_muted": "Teavitused on summutatud", + "nav_button_connecting": "loome ühendust", + "nav_upgrade_banner_label": "Uuenda ntfy Pro teenuseks", + "action_bar_profile_logout": "Logi välja" } From 047cc22dbaac4f2fd333215191e7aef2d954fd2f Mon Sep 17 00:00:00 2001 From: OZZY Date: Mon, 24 Feb 2025 16:13:50 +0000 Subject: [PATCH 080/117] Translated using Weblate (Arabic) Currently translated at 88.3% (358 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/ar/ --- web/public/static/langs/ar.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/ar.json b/web/public/static/langs/ar.json index b0ddadbe..158fa926 100644 --- a/web/public/static/langs/ar.json +++ b/web/public/static/langs/ar.json @@ -359,5 +359,6 @@ "account_basics_phone_numbers_dialog_verify_button_call": "اتصل بي", "account_basics_phone_numbers_dialog_code_label": "رمز التحقّق", "account_upgrade_dialog_tier_price_per_month": "شهر", - "prefs_appearance_theme_title": "الحُلّة" + "prefs_appearance_theme_title": "الحُلّة", + "subscribe_dialog_subscribe_use_another_background_info": "لن يتم استلام الاشعارات من الخوادم الخارجية عندما يكون تطبيق الويب مغلقاً" } From a92306b1811e46d497e9e1310af94bb9ceadcc51 Mon Sep 17 00:00:00 2001 From: Korab Arifi Date: Sat, 1 Mar 2025 20:43:21 +0100 Subject: [PATCH 081/117] Added translation using Weblate (Albanian) --- web/public/static/langs/sq.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 web/public/static/langs/sq.json diff --git a/web/public/static/langs/sq.json b/web/public/static/langs/sq.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/web/public/static/langs/sq.json @@ -0,0 +1 @@ +{} From 2eb5eb3e29fb529894d5536a95b155f7f6c34fb6 Mon Sep 17 00:00:00 2001 From: Korab Arifi Date: Sat, 1 Mar 2025 20:44:28 +0100 Subject: [PATCH 082/117] Translated using Weblate (Albanian) Currently translated at 10.1% (41 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/sq/ --- web/public/static/langs/sq.json | 44 ++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/sq.json b/web/public/static/langs/sq.json index 0967ef42..836b553b 100644 --- a/web/public/static/langs/sq.json +++ b/web/public/static/langs/sq.json @@ -1 +1,43 @@ -{} +{ + "common_back": "Prapa", + "signup_form_username": "Emri i përdoruesit", + "signup_title": "Krijo një llogari ntfy", + "signup_form_toggle_password_visibility": "Ndrysho dukshmërinë e fjalëkalimit", + "common_save": "Ruaj", + "signup_form_confirm_password": "Konfirmo Fjalëkalimin", + "common_copy_to_clipboard": "Kopjo", + "signup_form_button_submit": "Regjistrohu", + "signup_already_have_account": "Keni tashmë llogari? Identifikohu!", + "signup_disabled": "Regjistrimi është i çaktivizuar", + "signup_error_username_taken": "Emri i përdoruesit {{username}} është marrë tashmë", + "signup_error_creation_limit_reached": "U arrit kufiri i krijimit të llogarisë", + "login_title": "Hyni në llogarinë tuaj ntfy", + "login_form_button_submit": "Identifikohu", + "login_disabled": "Identifikimi është i çaktivizuar", + "action_bar_show_menu": "Shfaq menunë", + "action_bar_settings": "Parametrat", + "action_bar_account": "Llogaria", + "action_bar_change_display_name": "Ndrysho emrin e shfaqur", + "action_bar_reservation_add": "Rezervo temën", + "action_bar_reservation_edit": "Ndrysho rezervimin", + "action_bar_reservation_delete": "Hiq rezervimin", + "action_bar_reservation_limit_reached": "U arrit kufiri", + "action_bar_send_test_notification": "Dërgo njoftim testues", + "action_bar_clear_notifications": "Pastro të gjitha njoftimet", + "action_bar_mute_notifications": "Heshti njoftimet", + "action_bar_unmute_notifications": "Lejo njoftimet", + "action_bar_unsubscribe": "Ç'abonohu", + "action_bar_toggle_mute": "Hesht/lejo njoftimet", + "action_bar_toggle_action_menu": "Hap/mbyll menynë e veprimit", + "action_bar_profile_title": "Profili", + "action_bar_profile_settings": "Parametrat", + "action_bar_profile_logout": "Dil", + "action_bar_sign_in": "Identifikohu", + "action_bar_sign_up": "Regjistrohu", + "message_bar_type_message": "Shkruaj një mesazh këtu", + "common_cancel": "Anulo", + "signup_form_password": "Fjalëkalimi", + "common_add": "Shto", + "login_link_signup": "Regjistrohu", + "action_bar_logo_alt": "logo e ntfy" +} From 609c9fa37dd4b45009cb581d6b3b010dafc897c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Podg=C3=B3rski?= Date: Mon, 3 Mar 2025 22:19:50 +0100 Subject: [PATCH 083/117] Translated using Weblate (Polish) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pl/ --- web/public/static/langs/pl.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/pl.json b/web/public/static/langs/pl.json index 20cbfe29..3f90cac4 100644 --- a/web/public/static/langs/pl.json +++ b/web/public/static/langs/pl.json @@ -404,5 +404,10 @@ "prefs_reservations_dialog_title_add": "Zarezerwuj temat", "reservation_delete_dialog_action_keep_title": "Zachowaj wiadomości i załącznik w pamięci cache", "reservation_delete_dialog_action_keep_description": "Wiadomości i załączniki które są zapisane w pamięci cache będą dostępne publicznie dla każdego znającego nazwę powiązanego z nimi tematu.", - "web_push_unknown_notification_title": "Nieznane powiadomienie otrzymane od serwera" + "web_push_unknown_notification_title": "Nieznane powiadomienie otrzymane od serwera", + "action_bar_unmute_notifications": "Włącz ponownie powiadomienia", + "prefs_appearance_theme_title": "Wygląd", + "prefs_reservations_dialog_description": "Zastrzeżenie tematu daje użytkownikowi prawo własności do tego tematu i umożliwia zdefiniowanie uprawnień dostępu do tego tematu dla innych użytkowników.", + "reservation_delete_dialog_description": "Usunięcie rezerwacji powoduje rezygnację z prawa własności do tematu i umożliwia innym jego zarezerwowanie. Istniejące wiadomości i załączniki można zachować lub usunąć.", + "web_push_unknown_notification_body": "Konieczne może być zaktualizowanie ntfy poprzez otwarcie aplikacji internetowej" } From 29cf4f16d198b3079f99bf95b86dbb26157cdaee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eero=20H=C3=A4kkinen?= <+weblate@eero.xn--hkkinen-5wa.fi> Date: Thu, 20 Mar 2025 09:11:08 +0100 Subject: [PATCH 084/117] Translated using Weblate (Finnish) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fi/ --- web/public/static/langs/fi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/fi.json b/web/public/static/langs/fi.json index ab2f6188..a777ec00 100644 --- a/web/public/static/langs/fi.json +++ b/web/public/static/langs/fi.json @@ -266,7 +266,7 @@ "alert_not_supported_title": "Ilmoituksia ei tueta", "account_tokens_dialog_button_cancel": "Peruuta", "subscribe_dialog_error_user_anonymous": "Anonyymi", - "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} laskutetaan vuosittain. Tallenna {{save}}.", + "account_upgrade_dialog_tier_price_billed_yearly": "{{price}} laskutetaan vuosittain. Säästä {{save}}.", "prefs_notifications_min_priority_high_and_higher": "Korkea prioriteetti ja korkeammat", "account_usage_basis_ip_description": "Tämän tilin käyttötilastot ja rajoitukset perustuvat IP-osoitteeseesi, joten ne voidaan jakaa muiden käyttäjien kanssa. Yllä esitetyt rajat ovat likimääräisiä perustuen olemassa oleviin rajoituksiin.", "publish_dialog_priority_high": "Korkea prioriteetti", From 4e2a884da5d1126685b84d9786fd44a3ef30b1c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eero=20H=C3=A4kkinen?= <+weblate@eero.xn--hkkinen-5wa.fi> Date: Thu, 20 Mar 2025 09:24:50 +0100 Subject: [PATCH 085/117] Translated using Weblate (Finnish) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/fi/ --- web/public/static/langs/fi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/public/static/langs/fi.json b/web/public/static/langs/fi.json index a777ec00..4ddf2920 100644 --- a/web/public/static/langs/fi.json +++ b/web/public/static/langs/fi.json @@ -170,7 +170,7 @@ "account_basics_tier_description": "Tilisi taso", "account_basics_phone_numbers_description": "Puheluilmoituksia varten", "prefs_reservations_dialog_title_add": "Varaa topikki", - "account_basics_tier_free": "Vapaa", + "account_basics_tier_free": "Maksuton", "account_upgrade_dialog_cancel_warning": "Tämä peruuttaa tilauksesi ja alentaa tilisi {{date}}. Tuona päivänä topikit sekä palvelimen välimuistissa olevat viestit poistetaan.", "notifications_click_copy_url_button": "Kopioi linkki", "account_basics_tier_admin": "Admin", From 35e15cfd9d9ced2022b37d8dd57a9fb81db76e69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s?= Date: Sat, 22 Mar 2025 19:09:50 +0100 Subject: [PATCH 086/117] Translated using Weblate (Hungarian) Currently translated at 53.5% (217 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/hu/ --- web/public/static/langs/hu.json | 40 ++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/web/public/static/langs/hu.json b/web/public/static/langs/hu.json index e4e0b85b..45fcd50d 100644 --- a/web/public/static/langs/hu.json +++ b/web/public/static/langs/hu.json @@ -1,7 +1,7 @@ { "action_bar_send_test_notification": "Teszt értesítés küldése", "action_bar_clear_notifications": "Összes értesítés törlése", - "alert_not_supported_description": "A böngésző nem támogatja az értesítések fogadását.", + "alert_not_supported_description": "A böngésződ nem támogatja az értesítések fogadását", "action_bar_settings": "Beállítások", "action_bar_unsubscribe": "Leiratkozás", "message_bar_type_message": "Írd ide az üzenetet", @@ -9,19 +9,19 @@ "nav_button_all_notifications": "Összes értesítés", "nav_topics_title": "Feliratkozott témák", "alert_notification_permission_required_title": "Az értesítések le vannak tiltva", - "alert_notification_permission_required_description": "Engedélyezd a böngészőnek, hogy asztali értesítéseket jeleníttessen meg.", + "alert_notification_permission_required_description": "Engedélyezd a böngésződnek, hogy asztali értesítéseket jelenítsen meg", "nav_button_settings": "Beállítások", "nav_button_documentation": "Dokumentáció", "nav_button_publish_message": "Értesítés küldése", "alert_notification_permission_required_button": "Engedélyezés", - "alert_not_supported_title": "Nem támogatott funkció", - "notifications_copied_to_clipboard": "Másolva a vágólapra", + "alert_not_supported_title": "Az értesítések nincsenek támogatva", + "notifications_copied_to_clipboard": "Vágólapra másolva", "notifications_tags": "Címkék", "notifications_attachment_copy_url_title": "Másolja vágólapra a csatolmány URL-ét", "notifications_attachment_copy_url_button": "URL másolása", "notifications_attachment_open_title": "Menjen a(z) {{url}} címre", "notifications_attachment_open_button": "Csatolmány megnyitása", - "notifications_attachment_link_expired": "A letöltési hivatkozás lejárt", + "notifications_attachment_link_expired": "A letöltési link lejárt", "notifications_attachment_link_expires": "A hivatkozás {{date}}-kor jár le", "nav_button_subscribe": "Feliratkozás témára", "notifications_click_copy_url_title": "Másolja vágólapra a hivatkozás URL-ét", @@ -187,5 +187,33 @@ "prefs_users_edit_button": "Felhasználó szerkesztése", "prefs_users_delete_button": "Felhasználó törlése", "error_boundary_unsupported_indexeddb_title": "Privát böngészés nem támogatott", - "subscribe_dialog_subscribe_base_url_label": "Szolgáltató URL" + "subscribe_dialog_subscribe_base_url_label": "Szolgáltató URL", + "signup_form_username": "Felhasználónév", + "signup_form_password": "Jelszó", + "signup_form_button_submit": "Regisztráció", + "login_form_button_submit": "Bejelentkezés", + "login_link_signup": "Regisztráció", + "login_disabled": "Bejelentkezés kikapcsolva", + "action_bar_change_display_name": "Megjelenített név módosítása", + "action_bar_profile_logout": "Kijelentkezés", + "action_bar_sign_in": "Bejelentkezés", + "action_bar_sign_up": "Regisztráció", + "action_bar_profile_title": "Profil", + "nav_button_account": "Fiók", + "common_copy_to_clipboard": "Másolás vágólapra", + "action_bar_reservation_limit_reached": "Limit elérve", + "login_title": "Jelentkezz be a ntfy felhasználódba", + "signup_title": "Hozz létre egy ntfy felhasználói fiókot", + "signup_form_confirm_password": "Jelszó megerősítése", + "signup_already_have_account": "Már van felhasználód? Jelentkezz be!", + "action_bar_account": "Fiók", + "action_bar_profile_settings": "Beállítások", + "signup_error_username_taken": "A felhasználónév {{username}} már foglalt", + "signup_error_creation_limit_reached": "Felhasználói regisztráció limit elérve", + "action_bar_mute_notifications": "Értesítések némítása", + "action_bar_unmute_notifications": "Értesítések némításának feloldása", + "alert_notification_permission_denied_title": "Az értesítések blokkolva vannak", + "alert_notification_permission_denied_description": "Kérjük kapcsold őket vissza a böngésződben", + "alert_notification_ios_install_required_title": "iOS telepítés szükséges", + "alert_not_supported_context_description": "Az értesítések kizárólag HTTPS-en keresztül támogatottak. Ez a Notifications API korlátozása." } From adfacf820e448bfc2da7e5ae007c10bcad25a667 Mon Sep 17 00:00:00 2001 From: Max Badran Date: Tue, 25 Mar 2025 17:23:16 +0100 Subject: [PATCH 087/117] Translated using Weblate (Ukrainian) Currently translated at 99.7% (404 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/uk/ --- web/public/static/langs/uk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/uk.json b/web/public/static/langs/uk.json index c51dfcb3..e3e04a19 100644 --- a/web/public/static/langs/uk.json +++ b/web/public/static/langs/uk.json @@ -403,5 +403,6 @@ "error_boundary_button_reload_ntfy": "Перезавантажити ntfy", "web_push_subscription_expiring_title": "Сповіщення буде призупинено", "web_push_subscription_expiring_body": "Відкрийте ntfy, щоб продовжити отримувати сповіщення", - "web_push_unknown_notification_body": "Можливо вам потрібно оновити ntfy шляхом відкриття вебзастосунку" + "web_push_unknown_notification_body": "Можливо вам потрібно оновити ntfy шляхом відкриття вебзастосунку", + "alert_notification_ios_install_required_title": "потрібно встановити на iOS" } From 70f0e7ccc7f6c37c2623bd4f55cd13be861d66c5 Mon Sep 17 00:00:00 2001 From: Tyxiel <128870773+Tyxiel@users.noreply.github.com> Date: Mon, 31 Mar 2025 12:14:11 +0200 Subject: [PATCH 088/117] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (405 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/pt_BR/ --- web/public/static/langs/pt_BR.json | 66 +++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/pt_BR.json b/web/public/static/langs/pt_BR.json index 9d4dba3a..ffe4131a 100644 --- a/web/public/static/langs/pt_BR.json +++ b/web/public/static/langs/pt_BR.json @@ -340,5 +340,69 @@ "account_upgrade_dialog_tier_price_billed_monthly": "{{price}} por ano. Cobrado mensalmente.", "account_upgrade_dialog_button_pay_now": "Pague agora para assinar", "account_tokens_table_expires_header": "Expira", - "prefs_users_description_no_sync": "Usuários e senhas não estão sincronizados com a sua conta." + "prefs_users_description_no_sync": "Usuários e senhas não estão sincronizados com a sua conta.", + "account_tokens_description": "Use tokens de acesso ao publicar e assinar por meio da API ntfy, para que você não precise enviar as credenciais da sua conta. Consulte a documentação para saber mais.", + "account_tokens_table_cannot_delete_or_edit": "Não é possível editar ou excluir o token da sessão atual", + "account_tokens_dialog_title_edit": "Editar token de acesso", + "account_tokens_dialog_title_delete": "Excluir token de acesso", + "prefs_reservations_table_everyone_read_write": "Todos podem publicar e se inscrever", + "prefs_reservations_table_everyone_read_only": "Posso publicar e me inscrever, todos podem se inscrever", + "prefs_reservations_limit_reached": "Você atingiu seu limite de tópicos reservados.", + "prefs_reservations_delete_button": "Redefinir o acesso ao tópico", + "prefs_reservations_edit_button": "Editar acesso ao tópico", + "prefs_reservations_table_everyone_write_only": "Eu posso publicar e me inscrever, todos podem publicar", + "prefs_reservations_table_not_subscribed": "Não inscrito", + "prefs_reservations_table_click_to_subscribe": "Clique para se inscrever", + "reservation_delete_dialog_action_keep_title": "Manter mensagens e anexos em cache", + "account_tokens_table_label_header": "Rótulo", + "account_tokens_table_last_origin_tooltip": "Do endereço IP {{ip}}, clique para pesquisar", + "account_tokens_dialog_title_create": "Criar token de acesso", + "account_tokens_delete_dialog_title": "Excluir token de acesso", + "account_tokens_dialog_label": "Rótulo, por exemplo, notificações de Radarr", + "account_tokens_dialog_expires_never": "O token nunca expira", + "prefs_reservations_dialog_title_edit": "Editar tópico reservado", + "prefs_notifications_web_push_enabled_description": "As notificações são recebidas mesmo quando o aplicativo Web não está em execução (via Web Push)", + "prefs_notifications_web_push_disabled_description": "As notificações são recebidas quando o aplicativo Web está em execução (via WebSocket)", + "account_upgrade_dialog_billing_contact_website": "Para perguntas sobre faturamento, consulte nosso website.", + "account_tokens_table_create_token_button": "Criar token de acesso", + "account_tokens_dialog_button_cancel": "Cancelar", + "account_tokens_dialog_button_update": "Atualizar token", + "prefs_reservations_table": "Tabela de tópicos reservados", + "prefs_reservations_table_everyone_deny_all": "Somente eu posso publicar e me inscrever", + "account_tokens_delete_dialog_description": "Antes de excluir um token de acesso, certifique-se de que nenhum aplicativo ou script o esteja usando ativamente. Esta ação não pode ser desfeita.", + "account_tokens_delete_dialog_submit_button": "Excluir token permanentemente", + "account_tokens_dialog_expires_x_hours": "O token expira em {{hours}} horas", + "account_tokens_dialog_expires_x_days": "O token expira em {{days}} dias", + "prefs_reservations_description": "Você pode reservar nomes de tópicos para uso pessoal aqui. A reserva de um tópico lhe dá propriedade sobre ele e permite que você defina permissões de acesso para outros usuários sobre o tópico.", + "prefs_reservations_dialog_access_label": "Acesso", + "account_upgrade_dialog_billing_contact_email": "Para questões de cobrança, entre em contato conosco diretamente.", + "account_tokens_dialog_button_create": "Criar token", + "account_tokens_dialog_expires_label": "O token de acesso expira em", + "account_tokens_dialog_expires_unchanged": "Deixar a data de validade inalterada", + "prefs_notifications_web_push_title": "Notificações em segundo plano", + "prefs_notifications_web_push_enabled": "Ativado para {{server}}", + "prefs_notifications_web_push_disabled": "Desativado", + "prefs_appearance_theme_title": "Tema", + "prefs_users_table_cannot_delete_or_edit": "Não é possível excluir ou editar o usuário conectado", + "prefs_appearance_theme_system": "Sistema (padrão)", + "prefs_appearance_theme_dark": "Modo escuro", + "prefs_appearance_theme_light": "Modo claro", + "prefs_reservations_title": "Tópicos reservados", + "prefs_reservations_add_button": "Adicionar tópico reservado", + "prefs_reservations_table_topic_header": "Tópico", + "prefs_reservations_table_access_header": "Acesso", + "prefs_reservations_dialog_title_add": "Reservar tópico", + "prefs_reservations_dialog_title_delete": "Excluir reserva de tópico", + "prefs_reservations_dialog_description": "A reserva de um tópico lhe dá propriedade sobre ele e permite definir permissões de acesso para outros usuários sobre o tópico.", + "prefs_reservations_dialog_topic_label": "Tópico", + "reservation_delete_dialog_description": "A remoção de uma reserva abre mão da propriedade sobre o tópico e permite que outros o reservem. Você pode manter ou excluir as mensagens e os anexos existentes.", + "reservation_delete_dialog_action_keep_description": "As mensagens e os anexos armazenados em cache no servidor ficarão visíveis publicamente para as pessoas que souberem o nome do tópico.", + "reservation_delete_dialog_action_delete_title": "Excluir mensagens e anexos armazenados em cache", + "reservation_delete_dialog_action_delete_description": "As mensagens e os anexos armazenados em cache serão excluídos permanentemente. Essa ação não pode ser desfeita.", + "reservation_delete_dialog_submit_button": "Excluir reserva", + "error_boundary_button_reload_ntfy": "Recarregar ntfy", + "web_push_subscription_expiring_title": "As notificações serão pausadas", + "web_push_subscription_expiring_body": "Abra o ntfy para continuar recebendo notificações", + "web_push_unknown_notification_title": "Notificação desconhecida recebida do servidor", + "web_push_unknown_notification_body": "Talvez seja necessário atualizar o ntfy abrindo o aplicativo da Web" } From 8777990d2d522b15db054c5e699a68d2196424b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 23 Apr 2025 21:11:18 +0200 Subject: [PATCH 089/117] Translated using Weblate (Estonian) Currently translated at 24.9% (101 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/et/ --- web/public/static/langs/et.json | 60 ++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/web/public/static/langs/et.json b/web/public/static/langs/et.json index 11af0335..7d2a5a85 100644 --- a/web/public/static/langs/et.json +++ b/web/public/static/langs/et.json @@ -41,5 +41,63 @@ "nav_button_muted": "Teavitused on summutatud", "nav_button_connecting": "loome ühendust", "nav_upgrade_banner_label": "Uuenda ntfy Pro teenuseks", - "action_bar_profile_logout": "Logi välja" + "action_bar_profile_logout": "Logi välja", + "notifications_list_item": "Teavitus", + "account_tokens_table_expires_header": "Aegub", + "notifications_attachment_file_document": "muu dokument", + "notifications_list": "Teavituste loend", + "notifications_delete": "Kustuta", + "notifications_copied_to_clipboard": "Kopeeritud lõikelauale", + "alert_notification_permission_denied_description": "Palun luba nad veebibrauseris uuesti", + "account_tokens_table_last_access_header": "Viimase kasutamise aeg", + "account_tokens_table_token_header": "Tunnusluba", + "account_tokens_table_last_origin_tooltip": "IP-aadressilt {{ip}}, klõpsi täpsema teabe nägemiseks", + "action_bar_reservation_add": "Reserveeri teema", + "action_bar_reservation_edit": "Muuda reserveeringut", + "action_bar_reservation_delete": "Eemalda reserveering", + "action_bar_reservation_limit_reached": "Ülempiir on käes", + "action_bar_send_test_notification": "Saata testteavitus", + "action_bar_clear_notifications": "Kustuta kõik teavitused", + "action_bar_mute_notifications": "Summuta teavitused", + "nav_upgrade_banner_description": "Reserveeri teemasid, rohkem sõnumeid ja e-kirju ning suuremad manused", + "action_bar_unmute_notifications": "Lõpeta teavituste summutamine", + "action_bar_unsubscribe": "Lõpeta tellimus", + "action_bar_toggle_mute": "Lülita teavituste summutamine sisse/välja", + "action_bar_toggle_action_menu": "Ava/sulge tegevuste menüü", + "notifications_mark_read": "Märgi loetuks", + "notifications_tags": "Sildid", + "notifications_priority_x": "{{priority}}. prioriteet", + "notifications_new_indicator": "Uus teavitus", + "notifications_attachment_image": "Pilt manusena", + "notifications_attachment_copy_url_title": "Kopeeri manuse võrguaadress lõikelauale", + "notifications_attachment_copy_url_button": "Kopeeri võrguaadress", + "notifications_attachment_open_title": "Ava {{url}} aadress", + "notifications_attachment_open_button": "Ava manus", + "notifications_attachment_link_expires": "link aegub {{date}}", + "notifications_attachment_link_expired": "allalaadimise link on aegunud", + "notifications_attachment_file_image": "pildifail", + "notifications_attachment_file_video": "videofail", + "notifications_attachment_file_audio": "helifail", + "notifications_attachment_file_app": "Androidi rakenduse fail", + "notifications_click_copy_url_title": "Kopeeri lingi võrguaadress lõikelauale", + "notifications_click_copy_url_button": "Kopeeri link", + "notifications_click_open_button": "Ava link", + "notifications_actions_open_url_title": "Ava {{url}} aadress", + "notifications_actions_not_supported": "Toiming pole veebirakenduses toetatud", + "alert_notification_permission_required_title": "Teavitused pole kasutusel", + "alert_notification_permission_required_description": "Anna oma brauserile õigused näidata töölauateavitusi", + "alert_notification_permission_required_button": "Luba nüüd", + "alert_notification_permission_denied_title": "Teavitused on blokeeritud", + "alert_notification_ios_install_required_title": "Vajalik on iOS-i paigaldamine", + "alert_not_supported_title": "Teavitused pole toetatud", + "alert_not_supported_description": "Teavitused pole sinu veebibrauseris toetatud", + "account_tokens_table_label_header": "Silt", + "account_tokens_table_never_expires": "Ei aegu iialgi", + "account_tokens_table_current_session": "Praegune brauserisessioon", + "account_tokens_table_copied_to_clipboard": "Ligipääsu tunnusluba on kopeeritud", + "account_tokens_table_cannot_delete_or_edit": "Praeguse sessiooni tunnusluba ei saa muuta ega kustutada", + "account_tokens_table_create_token_button": "Loo ligipääsuks vajalik tunnusluba", + "account_tokens_dialog_title_create": "Loo ligipääsuks vajalik tunnusluba", + "account_tokens_dialog_title_edit": "Muuda ligipääsuks vajalikku tunnusluba", + "account_tokens_dialog_title_delete": "Kustuta ligipääsuks vajalik tunnusluba" } From 3bf02d3cd9a29249c3d1c46e300d491483ee0eb1 Mon Sep 17 00:00:00 2001 From: Andrea Toska Date: Tue, 20 May 2025 14:18:08 +0200 Subject: [PATCH 090/117] Translated using Weblate (Albanian) Currently translated at 15.0% (61 of 405 strings) Translation: ntfy/Web app Translate-URL: https://hosted.weblate.org/projects/ntfy/web/sq/ --- web/public/static/langs/sq.json | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/web/public/static/langs/sq.json b/web/public/static/langs/sq.json index 836b553b..c146c77d 100644 --- a/web/public/static/langs/sq.json +++ b/web/public/static/langs/sq.json @@ -1,7 +1,7 @@ { "common_back": "Prapa", "signup_form_username": "Emri i përdoruesit", - "signup_title": "Krijo një llogari ntfy", + "signup_title": "Krijo një llogari \"ntfy\"", "signup_form_toggle_password_visibility": "Ndrysho dukshmërinë e fjalëkalimit", "common_save": "Ruaj", "signup_form_confirm_password": "Konfirmo Fjalëkalimin", @@ -35,9 +35,29 @@ "action_bar_sign_in": "Identifikohu", "action_bar_sign_up": "Regjistrohu", "message_bar_type_message": "Shkruaj një mesazh këtu", - "common_cancel": "Anulo", + "common_cancel": "Anullo", "signup_form_password": "Fjalëkalimi", "common_add": "Shto", "login_link_signup": "Regjistrohu", - "action_bar_logo_alt": "logo e ntfy" + "action_bar_logo_alt": "logo e ntfy", + "message_bar_error_publishing": "Gabim duke postuar njoftimin", + "message_bar_show_dialog": "Trego dialogun e publikimit", + "message_bar_publish": "Publiko mesazhin", + "nav_topics_title": "Temat e abonuara", + "nav_button_all_notifications": "Të gjitha njoftimet", + "nav_button_account": "Llogaria", + "nav_button_settings": "Cilësimet", + "nav_button_publish_message": "Publiko njoftimin", + "nav_button_subscribe": "Abunohu tek tema", + "nav_button_connecting": "duke u lidhur", + "nav_upgrade_banner_label": "Përmirëso në ntfy Pro", + "nav_upgrade_banner_description": "Rezervoni tema, më shumë mesazhe dhe email-e, si dhe bashkëngjitje më të mëdha", + "nav_button_muted": "Njoftimet janë të fikura", + "alert_notification_permission_required_title": "Njoftimet janë të çaktivizuar", + "alert_notification_permission_required_description": "Jepni leje Browser-it tuaj për të shfaqur njoftimet në desktop", + "alert_notification_permission_denied_title": "Njoftimet janë të bllokuara", + "alert_notification_ios_install_required_title": "Instalimi i iOS-it detyrohet", + "alert_notification_permission_denied_description": "Ju lutemi riaktivizoni ato në Browser-in tuaj", + "nav_button_documentation": "Dokumentacion", + "alert_notification_permission_required_button": "Lejo tani" } From b2b9891a58c0c974b9f3dbfa3a58fd3d6c518ab0 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 22 May 2025 21:43:45 -0400 Subject: [PATCH 091/117] Add Tamil language --- docs/releases.md | 5 +++++ web/src/components/Preferences.jsx | 1 + 2 files changed, 6 insertions(+) diff --git a/docs/releases.md b/docs/releases.md index be676f6f..a76ec6a3 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1413,6 +1413,11 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Note about fail2ban in Docker ([#1175](https://github.com/binwiederhier/ntfy/pull/1175)), thanks to [@Measurity](https://github.com/Measurity)) * Lots of other tiny docs updates, tanks to everyone who contributed! +**Languages** + +* Update new languages from Weblate. Thanks to all the contributors! +* Added Tamil (தமிழ்) as a new language to the web app + ### ntfy Android app v1.16.1 (UNRELEASED) **Features:** diff --git a/web/src/components/Preferences.jsx b/web/src/components/Preferences.jsx index 6770f282..c733c23c 100644 --- a/web/src/components/Preferences.jsx +++ b/web/src/components/Preferences.jsx @@ -592,6 +592,7 @@ const Language = () => { Suomi Svenska Türkçe + தமிழ் From 69cf77383458c38987d99df348bab38a8d997386 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 22 May 2025 21:56:28 -0400 Subject: [PATCH 092/117] Fix webpush command --- cmd/webpush.go | 6 +++--- main.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/webpush.go b/cmd/webpush.go index a5f66e60..249f91c8 100644 --- a/cmd/webpush.go +++ b/cmd/webpush.go @@ -44,16 +44,16 @@ func generateWebPushKeys(c *cli.Context) error { return err } - if outputFIle := c.String("output-file"); outputFIle != "" { + if outputFile := c.String("output-file"); outputFile != "" { contents := fmt.Sprintf(`--- web-push-public-key: %s web-push-private-key: %s `, publicKey, privateKey) - err = os.WriteFile(outputFIle, []byte(contents), 0660) + err = os.WriteFile(outputFile, []byte(contents), 0660) if err != nil { return err } - _, err = fmt.Fprintf(c.App.ErrWriter, `Web Push keys written to %s.`, outputFIle) + _, err = fmt.Fprintf(c.App.ErrWriter, "Web Push keys written to %s.\n", outputFile) } else { _, err = fmt.Fprintf(c.App.ErrWriter, `Web Push keys generated. Add the following lines to your config file: diff --git a/main.go b/main.go index d23072d5..4e01a0d6 100644 --- a/main.go +++ b/main.go @@ -23,7 +23,7 @@ If you want to chat, simply join the Discord server (https://discord.gg/cT7ECsZj the Matrix room (https://matrix.to/#/#ntfy:matrix.org). ntfy %s (%s), runtime %s, built at %s -Copyright (C) Philipp C. Heckel, licensed under Apache License 2.0 & GPLv2 +Copyright (C) Philipp C. Heckel, licensed under Apache License 2.0 & GPLv2 `, version, commit[:7], runtime.Version(), date) app := cmd.New() From 8f9dafce2051a14c0daec0bc61a273f46765cda8 Mon Sep 17 00:00:00 2001 From: Hunter Kehoe Date: Sat, 25 Jan 2025 21:25:59 -0700 Subject: [PATCH 093/117] change user password via accounts API --- docs/releases.md | 1 + server/server_admin.go | 6 +++++ server/server_admin_test.go | 46 +++++++++++++++++++++++++++++++++++++ server/types.go | 1 + 4 files changed, 54 insertions(+) diff --git a/docs/releases.md b/docs/releases.md index a76ec6a3..959fbb83 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1381,6 +1381,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Write VAPID keys to file in `ntfy webpush --output-file` ([#1138](https://github.com/binwiederhier/ntfy/pull/1138), thanks to [@nogweii](https://github.com/nogweii)) * Add Docker major/minor version to image tags ([#1271](https://github.com/binwiederhier/ntfy/pull/1271), thanks to [@RoboMagus](https://github.com/RoboMagus)) * Add `latest` subscription param for grabbing just the most recent message ([#1216](https://github.com/binwiederhier/ntfy/pull/1216), thanks to [@wunter8](https://github.com/wunter8)) +* You can now change passwords via the accounts API (thanks to [@wunter8](https://github.com/wunter8) for implementing) **Bug fixes + maintenance:** diff --git a/server/server_admin.go b/server/server_admin.go index ac295718..0e7e311e 100644 --- a/server/server_admin.go +++ b/server/server_admin.go @@ -49,6 +49,12 @@ func (s *Server) handleUsersAdd(w http.ResponseWriter, r *http.Request, v *visit if err != nil && !errors.Is(err, user.ErrUserNotFound) { return err } else if u != nil { + if req.Force == true { + if err := s.userManager.ChangePassword(req.Username, req.Password); err != nil { + return err + } + return s.writeJSON(w, newSuccessResponse()) + } return errHTTPConflictUserExists } var tier *user.Tier diff --git a/server/server_admin_test.go b/server/server_admin_test.go index c2f8f95a..70574efe 100644 --- a/server/server_admin_test.go +++ b/server/server_admin_test.go @@ -49,6 +49,52 @@ func TestUser_AddRemove(t *testing.T) { "Authorization": util.BasicAuth("phil", "phil"), }) require.Equal(t, 200, rr.Code) + + // Check user was deleted + users, err = s.userManager.Users() + require.Nil(t, err) + require.Equal(t, 3, len(users)) + require.Equal(t, "phil", users[0].Name) + require.Equal(t, "emma", users[1].Name) + require.Equal(t, user.Everyone, users[2].Name) +} + +func TestUser_ChangePassword(t *testing.T) { + s := newTestServer(t, newTestConfigWithAuthFile(t)) + defer s.closeDatabases() + + // Create admin + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + + // Create user via API + rr := request(t, s, "PUT", "/v1/users", `{"username": "ben", "password": "ben"}`, map[string]string{ + "Authorization": util.BasicAuth("phil", "phil"), + }) + require.Equal(t, 200, rr.Code) + + // Try to login with first password + rr = request(t, s, "POST", "/v1/account/token", "", map[string]string{ + "Authorization": util.BasicAuth("ben", "ben"), + }) + require.Equal(t, 200, rr.Code) + + // Change password via API + rr = request(t, s, "PUT", "/v1/users", `{"username": "ben", "password": "ben-two", "force":true}`, map[string]string{ + "Authorization": util.BasicAuth("phil", "phil"), + }) + require.Equal(t, 200, rr.Code) + + // Make sure first password fails + rr = request(t, s, "POST", "/v1/account/token", "", map[string]string{ + "Authorization": util.BasicAuth("ben", "ben"), + }) + require.Equal(t, 401, rr.Code) + + // Try to login with second password + rr = request(t, s, "POST", "/v1/account/token", "", map[string]string{ + "Authorization": util.BasicAuth("ben", "ben-two"), + }) + require.Equal(t, 200, rr.Code) } func TestUser_AddRemove_Failures(t *testing.T) { diff --git a/server/types.go b/server/types.go index c6bdb4d1..1b95a73d 100644 --- a/server/types.go +++ b/server/types.go @@ -257,6 +257,7 @@ type apiUserAddRequest struct { Username string `json:"username"` Password string `json:"password"` Tier string `json:"tier"` + Force bool `json:"force"` // Used to change passwords/override existing user // Do not add 'role' here. We don't want to add admins via the API. } From ad7ab18fb737d22f3cbb434665cd49b0048dba44 Mon Sep 17 00:00:00 2001 From: Hunter Kehoe Date: Sat, 25 Jan 2025 21:37:23 -0700 Subject: [PATCH 094/117] prevent changing admin passwords --- server/server_admin.go | 3 +++ server/server_admin_test.go | 17 ++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/server/server_admin.go b/server/server_admin.go index 0e7e311e..a2654db7 100644 --- a/server/server_admin.go +++ b/server/server_admin.go @@ -50,6 +50,9 @@ func (s *Server) handleUsersAdd(w http.ResponseWriter, r *http.Request, v *visit return err } else if u != nil { if req.Force == true { + if u.IsAdmin() { + return errHTTPForbidden + } if err := s.userManager.ChangePassword(req.Username, req.Password); err != nil { return err } diff --git a/server/server_admin_test.go b/server/server_admin_test.go index 70574efe..c99ec549 100644 --- a/server/server_admin_test.go +++ b/server/server_admin_test.go @@ -59,7 +59,7 @@ func TestUser_AddRemove(t *testing.T) { require.Equal(t, user.Everyone, users[2].Name) } -func TestUser_ChangePassword(t *testing.T) { +func TestUser_ChangeUserPassword(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() @@ -97,6 +97,21 @@ func TestUser_ChangePassword(t *testing.T) { require.Equal(t, 200, rr.Code) } +func TestUser_DontChangeAdminPassword(t *testing.T) { + s := newTestServer(t, newTestConfigWithAuthFile(t)) + defer s.closeDatabases() + + // Create admin + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("admin", "admin", user.RoleAdmin)) + + // Try to change password via API + rr := request(t, s, "PUT", "/v1/users", `{"username": "admin", "password": "admin-new", "force":true}`, map[string]string{ + "Authorization": util.BasicAuth("phil", "phil"), + }) + require.Equal(t, 403, rr.Code) +} + func TestUser_AddRemove_Failures(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() From 2b40ad9a129dabbcbe7a90c3be26c9071e50a0ea Mon Sep 17 00:00:00 2001 From: Hunter Kehoe Date: Sat, 25 Jan 2025 21:47:11 -0700 Subject: [PATCH 095/117] make staticcheck happy --- server/server_admin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server_admin.go b/server/server_admin.go index a2654db7..d1cdefae 100644 --- a/server/server_admin.go +++ b/server/server_admin.go @@ -49,7 +49,7 @@ func (s *Server) handleUsersAdd(w http.ResponseWriter, r *http.Request, v *visit if err != nil && !errors.Is(err, user.ErrUserNotFound) { return err } else if u != nil { - if req.Force == true { + if req.Force { if u.IsAdmin() { return errHTTPForbidden } From fa48639517bd65b4b3f20472a015e6f7af409ea2 Mon Sep 17 00:00:00 2001 From: Hunter Kehoe Date: Thu, 22 May 2025 18:58:37 -0600 Subject: [PATCH 096/117] make POST create user and PUT update user --- server/server.go | 4 ++- server/server_admin.go | 49 +++++++++++++++++++++++++++++-------- server/server_admin_test.go | 14 +++++------ server/types.go | 3 +-- 4 files changed, 50 insertions(+), 20 deletions(-) diff --git a/server/server.go b/server/server.go index c4af5ce8..90e52bf4 100644 --- a/server/server.go +++ b/server/server.go @@ -446,8 +446,10 @@ func (s *Server) handleInternal(w http.ResponseWriter, r *http.Request, v *visit return s.ensureWebPushEnabled(s.handleWebManifest)(w, r, v) } else if r.Method == http.MethodGet && r.URL.Path == apiUsersPath { return s.ensureAdmin(s.handleUsersGet)(w, r, v) - } else if r.Method == http.MethodPut && r.URL.Path == apiUsersPath { + } else if r.Method == http.MethodPost && r.URL.Path == apiUsersPath { return s.ensureAdmin(s.handleUsersAdd)(w, r, v) + } else if r.Method == http.MethodPut && r.URL.Path == apiUsersPath { + return s.ensureAdmin(s.handleUsersUpdate)(w, r, v) } else if r.Method == http.MethodDelete && r.URL.Path == apiUsersPath { return s.ensureAdmin(s.handleUsersDelete)(w, r, v) } else if (r.Method == http.MethodPut || r.Method == http.MethodPost) && r.URL.Path == apiUsersAccessPath { diff --git a/server/server_admin.go b/server/server_admin.go index d1cdefae..e8e91320 100644 --- a/server/server_admin.go +++ b/server/server_admin.go @@ -39,7 +39,7 @@ func (s *Server) handleUsersGet(w http.ResponseWriter, r *http.Request, v *visit } func (s *Server) handleUsersAdd(w http.ResponseWriter, r *http.Request, v *visitor) error { - req, err := readJSONWithLimit[apiUserAddRequest](r.Body, jsonBodyBytesLimit, false) + req, err := readJSONWithLimit[apiUserAddOrUpdateRequest](r.Body, jsonBodyBytesLimit, false) if err != nil { return err } else if !user.AllowedUsername(req.Username) || req.Password == "" { @@ -49,15 +49,6 @@ func (s *Server) handleUsersAdd(w http.ResponseWriter, r *http.Request, v *visit if err != nil && !errors.Is(err, user.ErrUserNotFound) { return err } else if u != nil { - if req.Force { - if u.IsAdmin() { - return errHTTPForbidden - } - if err := s.userManager.ChangePassword(req.Username, req.Password); err != nil { - return err - } - return s.writeJSON(w, newSuccessResponse()) - } return errHTTPConflictUserExists } var tier *user.Tier @@ -79,6 +70,44 @@ func (s *Server) handleUsersAdd(w http.ResponseWriter, r *http.Request, v *visit } return s.writeJSON(w, newSuccessResponse()) } +func (s *Server) handleUsersUpdate(w http.ResponseWriter, r *http.Request, v *visitor) error { + req, err := readJSONWithLimit[apiUserAddOrUpdateRequest](r.Body, jsonBodyBytesLimit, false) + if err != nil { + return err + } else if !user.AllowedUsername(req.Username) || req.Password == "" { + return errHTTPBadRequest.Wrap("username invalid, or password missing") + } + u, err := s.userManager.User(req.Username) + if err != nil && !errors.Is(err, user.ErrUserNotFound) { + return err + } else if u != nil { + if u.IsAdmin() { + return errHTTPForbidden + } + if err := s.userManager.ChangePassword(req.Username, req.Password); err != nil { + return err + } + return s.writeJSON(w, newSuccessResponse()) + } + var tier *user.Tier + if req.Tier != "" { + tier, err = s.userManager.Tier(req.Tier) + if errors.Is(err, user.ErrTierNotFound) { + return errHTTPBadRequestTierInvalid + } else if err != nil { + return err + } + } + if err := s.userManager.AddUser(req.Username, req.Password, user.RoleUser); err != nil { + return err + } + if tier != nil { + if err := s.userManager.ChangeTier(req.Username, req.Tier); err != nil { + return err + } + } + return s.writeJSON(w, newSuccessResponse()) +} func (s *Server) handleUsersDelete(w http.ResponseWriter, r *http.Request, v *visitor) error { req, err := readJSONWithLimit[apiUserDeleteRequest](r.Body, jsonBodyBytesLimit, false) diff --git a/server/server_admin_test.go b/server/server_admin_test.go index c99ec549..194b0a18 100644 --- a/server/server_admin_test.go +++ b/server/server_admin_test.go @@ -20,7 +20,7 @@ func TestUser_AddRemove(t *testing.T) { })) // Create user via API - rr := request(t, s, "PUT", "/v1/users", `{"username": "ben", "password":"ben"}`, map[string]string{ + rr := request(t, s, "POST", "/v1/users", `{"username": "ben", "password":"ben"}`, map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), }) require.Equal(t, 200, rr.Code) @@ -67,7 +67,7 @@ func TestUser_ChangeUserPassword(t *testing.T) { require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) // Create user via API - rr := request(t, s, "PUT", "/v1/users", `{"username": "ben", "password": "ben"}`, map[string]string{ + rr := request(t, s, "POST", "/v1/users", `{"username": "ben", "password": "ben"}`, map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), }) require.Equal(t, 200, rr.Code) @@ -79,7 +79,7 @@ func TestUser_ChangeUserPassword(t *testing.T) { require.Equal(t, 200, rr.Code) // Change password via API - rr = request(t, s, "PUT", "/v1/users", `{"username": "ben", "password": "ben-two", "force":true}`, map[string]string{ + rr = request(t, s, "PUT", "/v1/users", `{"username": "ben", "password": "ben-two"}`, map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), }) require.Equal(t, 200, rr.Code) @@ -106,7 +106,7 @@ func TestUser_DontChangeAdminPassword(t *testing.T) { require.Nil(t, s.userManager.AddUser("admin", "admin", user.RoleAdmin)) // Try to change password via API - rr := request(t, s, "PUT", "/v1/users", `{"username": "admin", "password": "admin-new", "force":true}`, map[string]string{ + rr := request(t, s, "PUT", "/v1/users", `{"username": "admin", "password": "admin-new"}`, map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), }) require.Equal(t, 403, rr.Code) @@ -121,19 +121,19 @@ func TestUser_AddRemove_Failures(t *testing.T) { require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser)) // Cannot create user with invalid username - rr := request(t, s, "PUT", "/v1/users", `{"username": "not valid", "password":"ben"}`, map[string]string{ + rr := request(t, s, "POST", "/v1/users", `{"username": "not valid", "password":"ben"}`, map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), }) require.Equal(t, 400, rr.Code) // Cannot create user if user already exists - rr = request(t, s, "PUT", "/v1/users", `{"username": "phil", "password":"phil"}`, map[string]string{ + rr = request(t, s, "POST", "/v1/users", `{"username": "phil", "password":"phil"}`, map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), }) require.Equal(t, 40901, toHTTPError(t, rr.Body.String()).Code) // Cannot create user with invalid tier - rr = request(t, s, "PUT", "/v1/users", `{"username": "emma", "password":"emma", "tier": "invalid"}`, map[string]string{ + rr = request(t, s, "POST", "/v1/users", `{"username": "emma", "password":"emma", "tier": "invalid"}`, map[string]string{ "Authorization": util.BasicAuth("phil", "phil"), }) require.Equal(t, 40030, toHTTPError(t, rr.Body.String()).Code) diff --git a/server/types.go b/server/types.go index 1b95a73d..fd1931f5 100644 --- a/server/types.go +++ b/server/types.go @@ -253,11 +253,10 @@ type apiStatsResponse struct { MessagesRate float64 `json:"messages_rate"` // Average number of messages per second } -type apiUserAddRequest struct { +type apiUserAddOrUpdateRequest struct { Username string `json:"username"` Password string `json:"password"` Tier string `json:"tier"` - Force bool `json:"force"` // Used to change passwords/override existing user // Do not add 'role' here. We don't want to add admins via the API. } From e36e4856c9d04b2ad0e8ad5d080809d45c7b6cd0 Mon Sep 17 00:00:00 2001 From: Hunter Kehoe Date: Thu, 22 May 2025 19:57:57 -0600 Subject: [PATCH 097/117] allow changing password or tier with user PUT --- server/server_admin.go | 18 +++++++++------ server/server_admin_test.go | 46 +++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/server/server_admin.go b/server/server_admin.go index e8e91320..7c78adb3 100644 --- a/server/server_admin.go +++ b/server/server_admin.go @@ -74,8 +74,10 @@ func (s *Server) handleUsersUpdate(w http.ResponseWriter, r *http.Request, v *vi req, err := readJSONWithLimit[apiUserAddOrUpdateRequest](r.Body, jsonBodyBytesLimit, false) if err != nil { return err - } else if !user.AllowedUsername(req.Username) || req.Password == "" { - return errHTTPBadRequest.Wrap("username invalid, or password missing") + } else if !user.AllowedUsername(req.Username) { + return errHTTPBadRequest.Wrap("username invalid") + } else if req.Password == "" && req.Tier == "" { + return errHTTPBadRequest.Wrap("need to provide at least one of \"password\" or \"tier\"") } u, err := s.userManager.User(req.Username) if err != nil && !errors.Is(err, user.ErrUserNotFound) { @@ -84,10 +86,15 @@ func (s *Server) handleUsersUpdate(w http.ResponseWriter, r *http.Request, v *vi if u.IsAdmin() { return errHTTPForbidden } - if err := s.userManager.ChangePassword(req.Username, req.Password); err != nil { + if req.Password != "" { + if err := s.userManager.ChangePassword(req.Username, req.Password); err != nil { + return err + } + } + } else { + if err := s.userManager.AddUser(req.Username, req.Password, user.RoleUser); err != nil { return err } - return s.writeJSON(w, newSuccessResponse()) } var tier *user.Tier if req.Tier != "" { @@ -98,9 +105,6 @@ func (s *Server) handleUsersUpdate(w http.ResponseWriter, r *http.Request, v *vi return err } } - if err := s.userManager.AddUser(req.Username, req.Password, user.RoleUser); err != nil { - return err - } if tier != nil { if err := s.userManager.ChangeTier(req.Username, req.Tier); err != nil { return err diff --git a/server/server_admin_test.go b/server/server_admin_test.go index 194b0a18..80da3224 100644 --- a/server/server_admin_test.go +++ b/server/server_admin_test.go @@ -57,6 +57,12 @@ func TestUser_AddRemove(t *testing.T) { require.Equal(t, "phil", users[0].Name) require.Equal(t, "emma", users[1].Name) require.Equal(t, user.Everyone, users[2].Name) + + // Reject invalid user change + rr = request(t, s, "PUT", "/v1/users", `{"username": "ben"}`, map[string]string{ + "Authorization": util.BasicAuth("phil", "phil"), + }) + require.Equal(t, 400, rr.Code) } func TestUser_ChangeUserPassword(t *testing.T) { @@ -97,6 +103,46 @@ func TestUser_ChangeUserPassword(t *testing.T) { require.Equal(t, 200, rr.Code) } +func TestUser_ChangeUserTier(t *testing.T) { + s := newTestServer(t, newTestConfigWithAuthFile(t)) + defer s.closeDatabases() + + // Create admin, tier + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddTier(&user.Tier{ + Code: "tier1", + })) + require.Nil(t, s.userManager.AddTier(&user.Tier{ + Code: "tier2", + })) + + // Create user with tier via API + rr := request(t, s, "POST", "/v1/users", `{"username": "ben", "password":"ben", "tier": "tier1"}`, map[string]string{ + "Authorization": util.BasicAuth("phil", "phil"), + }) + require.Equal(t, 200, rr.Code) + + // Check users + users, err := s.userManager.Users() + require.Nil(t, err) + require.Equal(t, 3, len(users)) + require.Equal(t, "phil", users[0].Name) + require.Equal(t, "ben", users[1].Name) + require.Equal(t, user.RoleUser, users[1].Role) + require.Equal(t, "tier1", users[1].Tier.Code) + + // Change user tier via API + rr = request(t, s, "PUT", "/v1/users", `{"username": "ben", "tier": "tier2"}`, map[string]string{ + "Authorization": util.BasicAuth("phil", "phil"), + }) + require.Equal(t, 200, rr.Code) + + // Check users again + users, err = s.userManager.Users() + require.Nil(t, err) + require.Equal(t, "tier2", users[1].Tier.Code) +} + func TestUser_DontChangeAdminPassword(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() From 0fb60ae72d8387abf6280874d85379cb502d6bca Mon Sep 17 00:00:00 2001 From: Hunter Kehoe Date: Thu, 22 May 2025 20:01:50 -0600 Subject: [PATCH 098/117] test change user password and tier in single request --- server/server_admin_test.go | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/server/server_admin_test.go b/server/server_admin_test.go index 80da3224..98c268e9 100644 --- a/server/server_admin_test.go +++ b/server/server_admin_test.go @@ -143,6 +143,58 @@ func TestUser_ChangeUserTier(t *testing.T) { require.Equal(t, "tier2", users[1].Tier.Code) } +func TestUser_ChangeUserPasswordAndTier(t *testing.T) { + s := newTestServer(t, newTestConfigWithAuthFile(t)) + defer s.closeDatabases() + + // Create admin, tier + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddTier(&user.Tier{ + Code: "tier1", + })) + require.Nil(t, s.userManager.AddTier(&user.Tier{ + Code: "tier2", + })) + + // Create user with tier via API + rr := request(t, s, "POST", "/v1/users", `{"username": "ben", "password":"ben", "tier": "tier1"}`, map[string]string{ + "Authorization": util.BasicAuth("phil", "phil"), + }) + require.Equal(t, 200, rr.Code) + + // Check users + users, err := s.userManager.Users() + require.Nil(t, err) + require.Equal(t, 3, len(users)) + require.Equal(t, "phil", users[0].Name) + require.Equal(t, "ben", users[1].Name) + require.Equal(t, user.RoleUser, users[1].Role) + require.Equal(t, "tier1", users[1].Tier.Code) + + // Change user password and tier via API + rr = request(t, s, "PUT", "/v1/users", `{"username": "ben", "password":"ben-two", "tier": "tier2"}`, map[string]string{ + "Authorization": util.BasicAuth("phil", "phil"), + }) + require.Equal(t, 200, rr.Code) + + // Make sure first password fails + rr = request(t, s, "POST", "/v1/account/token", "", map[string]string{ + "Authorization": util.BasicAuth("ben", "ben"), + }) + require.Equal(t, 401, rr.Code) + + // Try to login with second password + rr = request(t, s, "POST", "/v1/account/token", "", map[string]string{ + "Authorization": util.BasicAuth("ben", "ben-two"), + }) + require.Equal(t, 200, rr.Code) + + // Check new tier + users, err = s.userManager.Users() + require.Nil(t, err) + require.Equal(t, "tier2", users[1].Tier.Code) +} + func TestUser_DontChangeAdminPassword(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() From 0581a9e6800fceae8775eb37237315979055dd06 Mon Sep 17 00:00:00 2001 From: dandersch <59270379+dandersch@users.noreply.github.com> Date: Fri, 23 May 2025 22:52:25 +0200 Subject: [PATCH 099/117] remove systemd user service cmds from postinst.sh --- scripts/postinst.sh | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/scripts/postinst.sh b/scripts/postinst.sh index 37ea3304..0cf80d10 100755 --- a/scripts/postinst.sh +++ b/scripts/postinst.sh @@ -41,13 +41,16 @@ if [ "$1" = "configure" ] || [ "$1" -ge 1 ]; then systemctl restart ntfy-client.service >/dev/null || true fi fi - if systemctl --user is-active -q ntfy-client.service; then - echo "Restarting ntfy-client.service (user)..." - if [ -x /usr/bin/deb-systemd-invoke ]; then - deb-systemd-invoke --user try-restart ntfy-client.service >/dev/null || true - else - systemctl --user restart ntfy-client.service >/dev/null || true - fi - fi + + # inform user about systemd user service + echo + echo "------------------------------------------------------------------------" + echo "ntfy includes a systemd user service." + echo "To enable it, run following commands as your regular user (not as root):" + echo + echo " systemctl --user enable ntfy-client.service" + echo " systemctl --user start ntfy-client.service" + echo "------------------------------------------------------------------------" + echo fi fi From 45e1707d3bb4498b31230b5921e206bd3ba71a37 Mon Sep 17 00:00:00 2001 From: dandersch <59270379+dandersch@users.noreply.github.com> Date: Fri, 23 May 2025 23:00:45 +0200 Subject: [PATCH 100/117] remove systemd user daemon-reload from postinst.sh --- scripts/postinst.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/postinst.sh b/scripts/postinst.sh index 0cf80d10..6e706205 100755 --- a/scripts/postinst.sh +++ b/scripts/postinst.sh @@ -24,7 +24,6 @@ if [ "$1" = "configure" ] || [ "$1" -ge 1 ]; then # Restart services systemctl --system daemon-reload >/dev/null || true - systemctl --user daemon-reload >/dev/null || true if systemctl is-active -q ntfy.service; then echo "Restarting ntfy.service ..." if [ -x /usr/bin/deb-systemd-invoke ]; then From 80462f7ee5f6c065267eabc6e88d18b714a7e4cb Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sat, 24 May 2025 08:58:44 -0400 Subject: [PATCH 101/117] Refine user API change --- server/server_admin.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/server/server_admin.go b/server/server_admin.go index 7c78adb3..92da1213 100644 --- a/server/server_admin.go +++ b/server/server_admin.go @@ -70,6 +70,7 @@ func (s *Server) handleUsersAdd(w http.ResponseWriter, r *http.Request, v *visit } return s.writeJSON(w, newSuccessResponse()) } + func (s *Server) handleUsersUpdate(w http.ResponseWriter, r *http.Request, v *visitor) error { req, err := readJSONWithLimit[apiUserAddOrUpdateRequest](r.Body, jsonBodyBytesLimit, false) if err != nil { @@ -96,16 +97,12 @@ func (s *Server) handleUsersUpdate(w http.ResponseWriter, r *http.Request, v *vi return err } } - var tier *user.Tier if req.Tier != "" { - tier, err = s.userManager.Tier(req.Tier) - if errors.Is(err, user.ErrTierNotFound) { + if _, err = s.userManager.Tier(req.Tier); errors.Is(err, user.ErrTierNotFound) { return errHTTPBadRequestTierInvalid } else if err != nil { return err } - } - if tier != nil { if err := s.userManager.ChangeTier(req.Username, req.Tier); err != nil { return err } From 4dc3b38c95482d22781297b794e4dc9c67c4adc7 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sat, 24 May 2025 09:31:57 -0400 Subject: [PATCH 102/117] Allow adding/changing user with password hash via v1/users API --- server/server_admin.go | 28 ++++++++++----- server/server_admin_test.go | 71 ++++++++++++++++++++++++++++++++++--- server/types.go | 1 + user/manager.go | 3 -- 4 files changed, 87 insertions(+), 16 deletions(-) diff --git a/server/server_admin.go b/server/server_admin.go index fc149e7f..eb362956 100644 --- a/server/server_admin.go +++ b/server/server_admin.go @@ -42,8 +42,8 @@ func (s *Server) handleUsersAdd(w http.ResponseWriter, r *http.Request, v *visit req, err := readJSONWithLimit[apiUserAddOrUpdateRequest](r.Body, jsonBodyBytesLimit, false) if err != nil { return err - } else if !user.AllowedUsername(req.Username) || req.Password == "" { - return errHTTPBadRequest.Wrap("username invalid, or password missing") + } else if !user.AllowedUsername(req.Username) || (req.Password == "" && req.Hash == "") { + return errHTTPBadRequest.Wrap("username invalid, or password/password_hash missing") } u, err := s.userManager.User(req.Username) if err != nil && !errors.Is(err, user.ErrUserNotFound) { @@ -60,7 +60,11 @@ func (s *Server) handleUsersAdd(w http.ResponseWriter, r *http.Request, v *visit return err } } - if err := s.userManager.AddUser(req.Username, req.Password, user.RoleUser, false); err != nil { + password, hashed := req.Password, false + if req.Hash != "" { + password, hashed = req.Hash, true + } + if err := s.userManager.AddUser(req.Username, password, user.RoleUser, hashed); err != nil { return err } if tier != nil { @@ -77,8 +81,8 @@ func (s *Server) handleUsersUpdate(w http.ResponseWriter, r *http.Request, v *vi return err } else if !user.AllowedUsername(req.Username) { return errHTTPBadRequest.Wrap("username invalid") - } else if req.Password == "" && req.Tier == "" { - return errHTTPBadRequest.Wrap("need to provide at least one of \"password\" or \"tier\"") + } else if req.Password == "" && req.Hash == "" && req.Tier == "" { + return errHTTPBadRequest.Wrap("need to provide at least one of \"password\", \"password_hash\" or \"tier\"") } u, err := s.userManager.User(req.Username) if err != nil && !errors.Is(err, user.ErrUserNotFound) { @@ -87,13 +91,21 @@ func (s *Server) handleUsersUpdate(w http.ResponseWriter, r *http.Request, v *vi if u.IsAdmin() { return errHTTPForbidden } - if req.Password != "" { - if err := s.userManager.ChangePassword(req.Username, req.Password); err != nil { + if req.Hash != "" { + if err := s.userManager.ChangePassword(req.Username, req.Hash, true); err != nil { + return err + } + } else if req.Password != "" { + if err := s.userManager.ChangePassword(req.Username, req.Password, false); err != nil { return err } } } else { - if err := s.userManager.AddUser(req.Username, req.Password, user.RoleUser); err != nil { + password, hashed := req.Password, false + if req.Hash != "" { + password, hashed = req.Hash, true + } + if err := s.userManager.AddUser(req.Username, password, user.RoleUser, hashed); err != nil { return err } } diff --git a/server/server_admin_test.go b/server/server_admin_test.go index 1fdc740f..8925702e 100644 --- a/server/server_admin_test.go +++ b/server/server_admin_test.go @@ -65,12 +65,41 @@ func TestUser_AddRemove(t *testing.T) { require.Equal(t, 400, rr.Code) } +func TestUser_AddWithPasswordHash(t *testing.T) { + s := newTestServer(t, newTestConfigWithAuthFile(t)) + defer s.closeDatabases() + + // Create admin + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) + + // Create user via API + rr := request(t, s, "POST", "/v1/users", `{"username": "ben", "hash":"$2a$04$2aPIIqPXQU16OfkSUZH1XOzpu1gsPRKkrfVdFLgWQ.tqb.vtTCuVe"}`, map[string]string{ + "Authorization": util.BasicAuth("phil", "phil"), + }) + require.Equal(t, 200, rr.Code) + + // Check that user can login with password + rr = request(t, s, "POST", "/v1/account/token", "", map[string]string{ + "Authorization": util.BasicAuth("ben", "ben"), + }) + require.Equal(t, 200, rr.Code) + + // Check users + users, err := s.userManager.Users() + require.Nil(t, err) + require.Equal(t, 3, len(users)) + require.Equal(t, "phil", users[0].Name) + require.Equal(t, user.RoleAdmin, users[0].Role) + require.Equal(t, "ben", users[1].Name) + require.Equal(t, user.RoleUser, users[1].Role) +} + func TestUser_ChangeUserPassword(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() // Create admin - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) // Create user via API rr := request(t, s, "POST", "/v1/users", `{"username": "ben", "password": "ben"}`, map[string]string{ @@ -108,7 +137,7 @@ func TestUser_ChangeUserTier(t *testing.T) { defer s.closeDatabases() // Create admin, tier - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) require.Nil(t, s.userManager.AddTier(&user.Tier{ Code: "tier1", })) @@ -148,7 +177,7 @@ func TestUser_ChangeUserPasswordAndTier(t *testing.T) { defer s.closeDatabases() // Create admin, tier - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) require.Nil(t, s.userManager.AddTier(&user.Tier{ Code: "tier1", })) @@ -195,13 +224,45 @@ func TestUser_ChangeUserPasswordAndTier(t *testing.T) { require.Equal(t, "tier2", users[1].Tier.Code) } +func TestUser_ChangeUserPasswordWithHash(t *testing.T) { + s := newTestServer(t, newTestConfigWithAuthFile(t)) + defer s.closeDatabases() + + // Create admin + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) + + // Create user with tier via API + rr := request(t, s, "POST", "/v1/users", `{"username": "ben", "password":"not-ben"}`, map[string]string{ + "Authorization": util.BasicAuth("phil", "phil"), + }) + require.Equal(t, 200, rr.Code) + + // Try to login with first password + rr = request(t, s, "POST", "/v1/account/token", "", map[string]string{ + "Authorization": util.BasicAuth("ben", "not-ben"), + }) + require.Equal(t, 200, rr.Code) + + // Change user password and tier via API + rr = request(t, s, "PUT", "/v1/users", `{"username": "ben", "hash":"$2a$04$2aPIIqPXQU16OfkSUZH1XOzpu1gsPRKkrfVdFLgWQ.tqb.vtTCuVe"}`, map[string]string{ + "Authorization": util.BasicAuth("phil", "phil"), + }) + require.Equal(t, 200, rr.Code) + + // Try to login with second password + rr = request(t, s, "POST", "/v1/account/token", "", map[string]string{ + "Authorization": util.BasicAuth("ben", "ben"), + }) + require.Equal(t, 200, rr.Code) +} + func TestUser_DontChangeAdminPassword(t *testing.T) { s := newTestServer(t, newTestConfigWithAuthFile(t)) defer s.closeDatabases() // Create admin - require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin)) - require.Nil(t, s.userManager.AddUser("admin", "admin", user.RoleAdmin)) + require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin, false)) + require.Nil(t, s.userManager.AddUser("admin", "admin", user.RoleAdmin, false)) // Try to change password via API rr := request(t, s, "PUT", "/v1/users", `{"username": "admin", "password": "admin-new"}`, map[string]string{ diff --git a/server/types.go b/server/types.go index fd1931f5..16049ee4 100644 --- a/server/types.go +++ b/server/types.go @@ -256,6 +256,7 @@ type apiStatsResponse struct { type apiUserAddOrUpdateRequest struct { Username string `json:"username"` Password string `json:"password"` + Hash string `json:"hash"` Tier string `json:"tier"` // Do not add 'role' here. We don't want to add admins via the API. } diff --git a/user/manager.go b/user/manager.go index d691d42f..59c8d51f 100644 --- a/user/manager.go +++ b/user/manager.go @@ -868,10 +868,8 @@ func (a *Manager) AddUser(username, password string, role Role, hashed bool) err if !AllowedUsername(username) || !AllowedRole(role) { return ErrInvalidArgument } - var hash []byte var err error = nil - if hashed { hash = []byte(password) } else { @@ -880,7 +878,6 @@ func (a *Manager) AddUser(username, password string, role Role, hashed bool) err return err } } - userID := util.RandomStringPrefix(userIDPrefix, userIDLength) syncTopic, now := util.RandomStringPrefix(syncTopicPrefix, syncTopicLength), time.Now().Unix() if _, err = a.db.Exec(insertUserQuery, userID, username, hash, role, syncTopic, now); err != nil { From eecd3245f0871e5327fe52819a9ef00ea843fb4c Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sat, 24 May 2025 09:36:16 -0400 Subject: [PATCH 103/117] Release notes --- docs/releases.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/releases.md b/docs/releases.md index 959fbb83..08a66752 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1381,7 +1381,8 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Write VAPID keys to file in `ntfy webpush --output-file` ([#1138](https://github.com/binwiederhier/ntfy/pull/1138), thanks to [@nogweii](https://github.com/nogweii)) * Add Docker major/minor version to image tags ([#1271](https://github.com/binwiederhier/ntfy/pull/1271), thanks to [@RoboMagus](https://github.com/RoboMagus)) * Add `latest` subscription param for grabbing just the most recent message ([#1216](https://github.com/binwiederhier/ntfy/pull/1216), thanks to [@wunter8](https://github.com/wunter8)) -* You can now change passwords via the accounts API (thanks to [@wunter8](https://github.com/wunter8) for implementing) +* Allow using `NTFY_PASSWORD_HASH` in `ntfy user` command instead of raw password ([#1340](https://github.com/binwiederhier/ntfy/pull/1340), thanks to [@wunter8](https://github.com/wunter8) for implementing) +* You can now change passwords via `v1/users` API ([#1267](https://github.com/binwiederhier/ntfy/pull/1267), thanks to [@wunter8](https://github.com/wunter8) for implementing) **Bug fixes + maintenance:** From f4c37ccfb965f4af2efbed37c2f3fe735c2c286d Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sat, 24 May 2025 14:22:02 -0400 Subject: [PATCH 104/117] Bump VIte --- docs/releases.md | 1 + go.mod | 6 +- go.sum | 12 +-- web/package-lock.json | 213 ++++++++++++++++++++---------------------- 4 files changed, 110 insertions(+), 122 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 08a66752..b6f6be19 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1387,6 +1387,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release **Bug fixes + maintenance:** * Security updates for dependencies and Docker images ([#1341](https://github.com/binwiederhier/ntfy/pull/1341)) +* Upgrade to Vite 6 ([#1342](https://github.com/binwiederhier/ntfy/pull/1342), thanks Dependabot) * Fix iOS delivery issues for read-protected topics ([#1207](https://github.com/binwiederhier/ntfy/pull/1287), thanks a lot to [@barart](https://github.com/barart)!) * Add `Date` header to outgoing emails to avoid rejection ([#1141](https://github.com/binwiederhier/ntfy/pull/1141), thanks to [@pcouy](https://github.com/pcouy)) * Fix IP address parsing when behind a proxy ([#1266](https://github.com/binwiederhier/ntfy/pull/1266), thanks to [@mmatuska](https://github.com/mmatuska)) diff --git a/go.mod b/go.mod index 05315a6c..0e1533d9 100644 --- a/go.mod +++ b/go.mod @@ -83,9 +83,9 @@ require ( github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect github.com/zeebo/errs v1.4.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect go.opentelemetry.io/otel v1.36.0 // indirect go.opentelemetry.io/otel/metric v1.36.0 // indirect go.opentelemetry.io/otel/sdk v1.36.0 // indirect diff --git a/go.sum b/go.sum index 6a26dec4..e1d6b2f0 100644 --- a/go.sum +++ b/go.sum @@ -157,12 +157,12 @@ github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= -go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0 h1:PB3Zrjs1sG1GBX51SXyTSoOTqcDglmsk7nT6tkKPb/k= diff --git a/web/package-lock.json b/web/package-lock.json index 7a08b299..3f428c2e 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -12,7 +12,7 @@ "@emotion/react": "^11.11.0", "@emotion/styled": "^11.11.0", "@mui/icons-material": "^5.4.2", - "@mui/material": "*", + "@mui/material": "latest", "dexie": "^3.2.1", "dexie-react-hooks": "^1.1.1", "humanize-duration": "^3.27.3", @@ -20,8 +20,8 @@ "i18next-browser-languagedetector": "^6.1.4", "i18next-http-backend": "^1.4.0", "js-base64": "^3.7.2", - "react": "*", - "react-dom": "*", + "react": "latest", + "react-dom": "latest", "react-i18next": "^11.16.2", "react-infinite-scroll-component": "^6.1.0", "react-remark": "^2.1.0", @@ -2647,6 +2647,13 @@ "node": ">=14.0.0" } }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.9", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz", + "integrity": "sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", @@ -2719,9 +2726,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", - "integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", + "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", "cpu": [ "arm" ], @@ -2733,9 +2740,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz", - "integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", + "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", "cpu": [ "arm64" ], @@ -2747,9 +2754,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz", - "integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", + "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", "cpu": [ "arm64" ], @@ -2761,9 +2768,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz", - "integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", + "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", "cpu": [ "x64" ], @@ -2775,9 +2782,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz", - "integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", + "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", "cpu": [ "arm64" ], @@ -2789,9 +2796,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz", - "integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", + "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", "cpu": [ "x64" ], @@ -2803,9 +2810,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz", - "integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", + "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", "cpu": [ "arm" ], @@ -2817,9 +2824,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz", - "integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", + "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", "cpu": [ "arm" ], @@ -2831,9 +2838,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz", - "integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", + "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", "cpu": [ "arm64" ], @@ -2845,9 +2852,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz", - "integrity": "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", + "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", "cpu": [ "arm64" ], @@ -2859,9 +2866,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz", - "integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", + "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", "cpu": [ "loong64" ], @@ -2873,9 +2880,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz", - "integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", + "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", "cpu": [ "ppc64" ], @@ -2887,9 +2894,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz", - "integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", + "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", "cpu": [ "riscv64" ], @@ -2901,9 +2908,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz", - "integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", + "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", "cpu": [ "riscv64" ], @@ -2915,9 +2922,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz", - "integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", + "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", "cpu": [ "s390x" ], @@ -2929,9 +2936,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz", - "integrity": "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", + "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", "cpu": [ "x64" ], @@ -2943,9 +2950,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz", - "integrity": "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", + "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", "cpu": [ "x64" ], @@ -2957,9 +2964,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz", - "integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", + "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", "cpu": [ "arm64" ], @@ -2971,9 +2978,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz", - "integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", + "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", "cpu": [ "ia32" ], @@ -2985,9 +2992,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", - "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", + "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", "cpu": [ "x64" ], @@ -3086,18 +3093,6 @@ "@types/unist": "^2" } }, - "node_modules/@types/node": { - "version": "22.15.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.21.tgz", - "integrity": "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~6.21.0" - } - }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -3157,15 +3152,16 @@ "license": "ISC" }, "node_modules/@vitejs/plugin-react": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", - "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.0.tgz", + "integrity": "sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.26.10", "@babel/plugin-transform-react-jsx-self": "^7.25.9", "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@rolldown/pluginutils": "1.0.0-beta.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, @@ -4109,9 +4105,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.155", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", - "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", + "version": "1.5.157", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.157.tgz", + "integrity": "sha512-/0ybgsQd1muo8QlnuTpKwtl0oX5YMlUGbm8xyqgDU00motRkKFFbUJySAQBWcY79rVqNLWIWa87BGVGClwAB2w==", "dev": true, "license": "ISC" }, @@ -7385,9 +7381,9 @@ } }, "node_modules/rollup": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", - "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", + "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", "dev": true, "license": "MIT", "dependencies": { @@ -7401,26 +7397,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.41.0", - "@rollup/rollup-android-arm64": "4.41.0", - "@rollup/rollup-darwin-arm64": "4.41.0", - "@rollup/rollup-darwin-x64": "4.41.0", - "@rollup/rollup-freebsd-arm64": "4.41.0", - "@rollup/rollup-freebsd-x64": "4.41.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", - "@rollup/rollup-linux-arm-musleabihf": "4.41.0", - "@rollup/rollup-linux-arm64-gnu": "4.41.0", - "@rollup/rollup-linux-arm64-musl": "4.41.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", - "@rollup/rollup-linux-riscv64-gnu": "4.41.0", - "@rollup/rollup-linux-riscv64-musl": "4.41.0", - "@rollup/rollup-linux-s390x-gnu": "4.41.0", - "@rollup/rollup-linux-x64-gnu": "4.41.0", - "@rollup/rollup-linux-x64-musl": "4.41.0", - "@rollup/rollup-win32-arm64-msvc": "4.41.0", - "@rollup/rollup-win32-ia32-msvc": "4.41.0", - "@rollup/rollup-win32-x64-msvc": "4.41.0", + "@rollup/rollup-android-arm-eabi": "4.41.1", + "@rollup/rollup-android-arm64": "4.41.1", + "@rollup/rollup-darwin-arm64": "4.41.1", + "@rollup/rollup-darwin-x64": "4.41.1", + "@rollup/rollup-freebsd-arm64": "4.41.1", + "@rollup/rollup-freebsd-x64": "4.41.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", + "@rollup/rollup-linux-arm-musleabihf": "4.41.1", + "@rollup/rollup-linux-arm64-gnu": "4.41.1", + "@rollup/rollup-linux-arm64-musl": "4.41.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-musl": "4.41.1", + "@rollup/rollup-linux-s390x-gnu": "4.41.1", + "@rollup/rollup-linux-x64-gnu": "4.41.1", + "@rollup/rollup-linux-x64-musl": "4.41.1", + "@rollup/rollup-win32-arm64-msvc": "4.41.1", + "@rollup/rollup-win32-ia32-msvc": "4.41.1", + "@rollup/rollup-win32-x64-msvc": "4.41.1", "fsevents": "~2.3.2" } }, @@ -8280,15 +8276,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", From 6fe3913aeedad166fab313c2baf41960d85296bc Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sat, 24 May 2025 15:26:25 -0400 Subject: [PATCH 105/117] Increase Web Push expiration to 55/60 days, update configs --- docs/config.md | 14 +++++++++----- docs/releases.md | 2 ++ server/config.go | 4 ++-- server/webpush_store.go | 9 +++++++-- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/docs/config.md b/docs/config.md index e1808fc9..2cfda9a6 100644 --- a/docs/config.md +++ b/docs/config.md @@ -878,8 +878,8 @@ a database to keep track of the browser's subscriptions, and an admin email addr - `web-push-file` is a database file to keep track of browser subscription endpoints, e.g. `/var/cache/ntfy/webpush.db` - `web-push-email-address` is the admin email address send to the push provider, e.g. `sysadmin@example.com` - `web-push-startup-queries` is an optional list of queries to run on startup` -- `web-push-expiry-warning-duration` defines the duration after which unused subscriptions are sent a warning (default is `7d`) -- `web-push-expiry-duration` defines the duration after which unused subscriptions will expire (default is `9d`) +- `web-push-expiry-warning-duration` defines the duration after which unused subscriptions are sent a warning (default is `55d`) +- `web-push-expiry-duration` defines the duration after which unused subscriptions will expire (default is `60d`) Limitations: @@ -906,8 +906,8 @@ web-push-file: /var/cache/ntfy/webpush.db web-push-email-address: sysadmin@example.com ``` -The `web-push-file` is used to store the push subscriptions. Unused subscriptions will send out a warning after 7 days, -and will automatically expire after 9 days (default). If the gateway returns an error (e.g. 410 Gone when a user has unsubscribed), +The `web-push-file` is used to store the push subscriptions. Unused subscriptions will send out a warning after 55 days, +and will automatically expire after 60 days (default). If the gateway returns an error (e.g. 410 Gone when a user has unsubscribed), subscriptions are also removed automatically. The web app refreshes subscriptions on start and regularly on an interval, but this file should be persisted across restarts. If the subscription @@ -1382,7 +1382,7 @@ variable before running the `ntfy` command (e.g. `export NTFY_LISTEN_HTTP=:80`). | `listen-unix-mode` | `NTFY_LISTEN_UNIX_MODE` | *file mode* | *system default* | File mode of the Unix socket, e.g. 0700 or 0777 | | `key-file` | `NTFY_KEY_FILE` | *filename* | - | HTTPS/TLS private key file, only used if `listen-https` is set. | | `cert-file` | `NTFY_CERT_FILE` | *filename* | - | HTTPS/TLS certificate file, only used if `listen-https` is set. | -| `firebase-key-file` | `NTFY_FIREBASE_KEY_FILE` | *filename* | - | If set, also publish messages to a Firebase Cloud Messaging (FCM) topic for your app. This is optional and only required to save battery when using the Android app. See [Firebase (FCM)](#firebase-fcm). | +| `firebase-key-file` | `NTFY_FIREBASE_KEY_FILE` | *filename* | - | If set, also publish messages to a Firebase Cloud Messaging (FCM) topic for your app. This is optional and only required to save battery when using the Android app. See [Firebase (FCM)](#firebase-fcm). | | `cache-file` | `NTFY_CACHE_FILE` | *filename* | - | If set, messages are cached in a local SQLite database instead of only in-memory. This allows for service restarts without losing messages in support of the since= parameter. See [message cache](#message-cache). | | `cache-duration` | `NTFY_CACHE_DURATION` | *duration* | 12h | Duration for which messages will be buffered before they are deleted. This is required to support the `since=...` and `poll=1` parameter. Set this to `0` to disable the cache entirely. | | `cache-startup-queries` | `NTFY_CACHE_STARTUP_QUERIES` | *string (SQL queries)* | - | SQL queries to run during database startup; this is useful for tuning and [enabling WAL mode](#message-cache) | @@ -1435,6 +1435,8 @@ variable before running the `ntfy` command (e.g. `export NTFY_LISTEN_HTTP=:80`). | `web-push-file` | `NTFY_WEB_PUSH_FILE` | *string* | - | Web Push: Database file that stores subscriptions | | `web-push-email-address` | `NTFY_WEB_PUSH_EMAIL_ADDRESS` | *string* | - | Web Push: Sender email address | | `web-push-startup-queries` | `NTFY_WEB_PUSH_STARTUP_QUERIES` | *string* | - | Web Push: SQL queries to run against subscription database at startup | +| `web-push-expiry-duration` | `NTFY_WEB_PUSH_EXPIRY_DURATION` | *duration* | 60d | Web Push: Duration after which a subscription is considered stale and will be deleted. This is to prevent stale subscriptions. | +| `web-push-expiry-warning-duration` | `NTFY_WEB_PUSH_EXPIRY_WARNING_DURATION` | *duration* | 55d | Web Push: Duration after which a warning is sent to subscribers that their subscription will expire soon. This is to prevent stale subscriptions. | | `log-format` | `NTFY_LOG_FORMAT` | *string* | `text` | Defines the output format, can be text or json | | `log-file` | `NTFY_LOG_FILE` | *string* | - | Defines the filename to write logs to. If this is not set, ntfy logs to stderr | | `log-level` | `NTFY_LOG_LEVEL` | *string* | `info` | Defines the default log level, can be one of trace, debug, info, warn or error | @@ -1537,5 +1539,7 @@ OPTIONS: --web-push-file value, --web_push_file value file used to store web push subscriptions [$NTFY_WEB_PUSH_FILE] --web-push-email-address value, --web_push_email_address value e-mail address of sender, required to use browser push services [$NTFY_WEB_PUSH_EMAIL_ADDRESS] --web-push-startup-queries value, --web_push_startup_queries value queries run when the web push database is initialized [$NTFY_WEB_PUSH_STARTUP_QUERIES] + --web-push-expiry-duration value, --web_push_expiry_duration value automatically expire unused subscriptions after this time (default: "60d") [$NTFY_WEB_PUSH_EXPIRY_DURATION] + --web-push-expiry-warning-duration value, --web_push_expiry_warning_duration value send web push warning notification after this time before expiring unused subscriptions (default: "55d") [$NTFY_WEB_PUSH_EXPIRY_WARNING_DURATION] --help, -h show help ``` diff --git a/docs/releases.md b/docs/releases.md index b6f6be19..dabe9c2b 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1383,6 +1383,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Add `latest` subscription param for grabbing just the most recent message ([#1216](https://github.com/binwiederhier/ntfy/pull/1216), thanks to [@wunter8](https://github.com/wunter8)) * Allow using `NTFY_PASSWORD_HASH` in `ntfy user` command instead of raw password ([#1340](https://github.com/binwiederhier/ntfy/pull/1340), thanks to [@wunter8](https://github.com/wunter8) for implementing) * You can now change passwords via `v1/users` API ([#1267](https://github.com/binwiederhier/ntfy/pull/1267), thanks to [@wunter8](https://github.com/wunter8) for implementing) +* Make WebPush subscription warning/expiry configurable, increase default to 55/60 days ([#1212](https://github.com/binwiederhier/ntfy/pull/1212), thanks to [@KuroSetsuna29](https://github.com/KuroSetsuna29)) **Bug fixes + maintenance:** @@ -1395,6 +1396,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Add OCI image version to Docker image ([#1307](https://github.com/binwiederhier/ntfy/pull/1307), thanks to [@jlssmt](https://github.com/jlssmt)) * WebSocket returning incorrect HTTP error code ([#1338](https://github.com/binwiederhier/ntfy/pull/1338) / [#1337](https://github.com/binwiederhier/ntfy/pull/1337), thanks to [@wunter8](https://github.com/wunter8) for debugging and implementing) * Make Markdown in the web app scrollable horizontally ([#1262](https://github.com/binwiederhier/ntfy/pull/1262), thanks to [@rake5k](https://github.com/rake5k) for fixing) +* Make sure WebPush subscription topics are actually deleted (no ticket) **Documentation:** diff --git a/server/config.go b/server/config.go index 7267ce9d..877b249a 100644 --- a/server/config.go +++ b/server/config.go @@ -26,8 +26,8 @@ const ( // Defines default Web Push settings const ( - DefaultWebPushExpiryWarningDuration = 7 * 24 * time.Hour - DefaultWebPushExpiryDuration = 9 * 24 * time.Hour + DefaultWebPushExpiryWarningDuration = 55 * 24 * time.Hour + DefaultWebPushExpiryDuration = 60 * 24 * time.Hour ) // Defines all global and per-visitor limits diff --git a/server/webpush_store.go b/server/webpush_store.go index 62a35f7d..db0304be 100644 --- a/server/webpush_store.go +++ b/server/webpush_store.go @@ -79,8 +79,9 @@ const ( deleteWebPushSubscriptionByUserIDQuery = `DELETE FROM subscription WHERE user_id = ?` deleteWebPushSubscriptionByAgeQuery = `DELETE FROM subscription WHERE updated_at <= ?` // Full table scan! - insertWebPushSubscriptionTopicQuery = `INSERT INTO subscription_topic (subscription_id, topic) VALUES (?, ?)` - deleteWebPushSubscriptionTopicAllQuery = `DELETE FROM subscription_topic WHERE subscription_id = ?` + insertWebPushSubscriptionTopicQuery = `INSERT INTO subscription_topic (subscription_id, topic) VALUES (?, ?)` + deleteWebPushSubscriptionTopicAllQuery = `DELETE FROM subscription_topic WHERE subscription_id = ?` + deleteWebPushSubscriptionTopicWithoutSubscription = `DELETE FROM subscription_topic WHERE subscription_id NOT IN (SELECT id FROM subscription)` ) // Schema management queries @@ -271,6 +272,10 @@ func (c *webPushStore) RemoveSubscriptionsByUserID(userID string) error { // RemoveExpiredSubscriptions removes all subscriptions that have not been updated for a given time period func (c *webPushStore) RemoveExpiredSubscriptions(expireAfter time.Duration) error { _, err := c.db.Exec(deleteWebPushSubscriptionByAgeQuery, time.Now().Add(-expireAfter).Unix()) + if err != nil { + return err + } + _, err = c.db.Exec(deleteWebPushSubscriptionTopicWithoutSubscription) return err } From df7dd9c498086617f5350c1da042a0d37ada825a Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sat, 24 May 2025 15:55:02 -0400 Subject: [PATCH 106/117] Fix weebpush test --- server/server_webpush_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/server_webpush_test.go b/server/server_webpush_test.go index ab7a20c4..f7379511 100644 --- a/server/server_webpush_test.go +++ b/server/server_webpush_test.go @@ -212,7 +212,7 @@ func TestServer_WebPush_Expiry(t *testing.T) { addSubscription(t, s, pushService.URL+"/push-receive", "test-topic") requireSubscriptionCount(t, s, "test-topic", 1) - _, err := s.webPush.db.Exec("UPDATE subscription SET updated_at = ?", time.Now().Add(-7*24*time.Hour).Unix()) + _, err := s.webPush.db.Exec("UPDATE subscription SET updated_at = ?", time.Now().Add(-55*24*time.Hour).Unix()) require.Nil(t, err) s.pruneAndNotifyWebPushSubscriptions() @@ -222,7 +222,7 @@ func TestServer_WebPush_Expiry(t *testing.T) { return received.Load() }) - _, err = s.webPush.db.Exec("UPDATE subscription SET updated_at = ?", time.Now().Add(-9*24*time.Hour).Unix()) + _, err = s.webPush.db.Exec("UPDATE subscription SET updated_at = ?", time.Now().Add(-60*24*time.Hour).Unix()) require.Nil(t, err) s.pruneAndNotifyWebPushSubscriptions() From 5eb84f759bdf3468a86601eab7d6dd70c7dff81c Mon Sep 17 00:00:00 2001 From: leukosaima <187358+leukosaima@users.noreply.github.com> Date: Sun, 25 May 2025 00:20:55 -0400 Subject: [PATCH 107/117] Add ntfyrr project --- docs/integrations.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/integrations.md b/docs/integrations.md index 5e550b53..7452c70d 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -45,7 +45,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [Watchtower](https://containrrr.dev/watchtower/) ⭐ - Automating Docker container base image updates (see [integration example](examples.md#watchtower-shoutrrr)) - [Jellyfin](https://jellyfin.org/) ⭐ - The Free Software Media System (see [integration example](examples.md#)) -- [Overseer](https://docs.overseerr.dev/using-overseerr/notifications/webhooks) ⭐ - a request management and media discovery tool for Plex (see [integration example](examples.md#jellyseerroverseerr-webhook)) +- [Overseerr](https://docs.overseerr.dev/using-overseerr/notifications/webhooks) ⭐ - a request management and media discovery tool for Plex (see [integration example](examples.md#jellyseerroverseerr-webhook)) - [Tautulli](https://github.com/Tautulli/Tautulli) ⭐ - Monitoring and tracking tool for Plex (integration [via webhook](https://github.com/Tautulli/Tautulli/wiki/Notification-Agents-Guide#webhook)) - [Mailrise](https://github.com/YoRyan/mailrise) - An SMTP gateway (integration via [Apprise](https://github.com/caronc/apprise/wiki/Notify_ntfy)) - [Proxmox-Ntfy](https://github.com/qtsone/proxmox-ntfy) - Python script that monitors Proxmox tasks and sends notifications using the Ntfy service. @@ -170,6 +170,7 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) - An ntfy MCP server for sending/fetching ntfy notifications to your self-hosted ntfy server from AI Agents (supports secure token auth & more - use with npx or docker!) (Node/Typescript) - [InvaderInformant](https://github.com/patricksthannon/InvaderInformant) - Script for Mac OS systems that monitors new or dropped connections to your network using ntfy (Shell) - [NtfyPwsh](https://github.com/ptmorris1/NtfyPwsh) - PowerShell module to help send messages to ntfy (PowerShell) +- [ntfyrr](https://github.com/leukosaima/ntfyrr) - Currently an Overseerr webhook notification to ntfy helper service. ## Blog + forum posts From f40023aa232696637b0cd50d08b4f146091d0013 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 25 May 2025 12:09:57 -0400 Subject: [PATCH 108/117] APNs fix --- server/server_firebase.go | 97 +++++++++++++++++----------------- server/server_firebase_test.go | 2 + 2 files changed, 50 insertions(+), 49 deletions(-) diff --git a/server/server_firebase.go b/server/server_firebase.go index 2b01add2..99f1fb28 100644 --- a/server/server_firebase.go +++ b/server/server_firebase.go @@ -138,41 +138,7 @@ func toFirebaseMessage(m *message, auther user.Auther) (*messaging.Message, erro } apnsConfig = createAPNSAlertConfig(m, data) case messageEvent: - allowForward := true if auther != nil { - allowForward = auther.Authorize(nil, m.Topic, user.PermissionRead) == nil - } - if allowForward { - data = map[string]string{ - "id": m.ID, - "time": fmt.Sprintf("%d", m.Time), - "event": m.Event, - "topic": m.Topic, - "priority": fmt.Sprintf("%d", m.Priority), - "tags": strings.Join(m.Tags, ","), - "click": m.Click, - "icon": m.Icon, - "title": m.Title, - "message": m.Message, - "content_type": m.ContentType, - "encoding": m.Encoding, - } - if len(m.Actions) > 0 { - actions, err := json.Marshal(m.Actions) - if err != nil { - return nil, err - } - data["actions"] = string(actions) - } - if m.Attachment != nil { - data["attachment_name"] = m.Attachment.Name - data["attachment_type"] = m.Attachment.Type - data["attachment_size"] = fmt.Sprintf("%d", m.Attachment.Size) - data["attachment_expires"] = fmt.Sprintf("%d", m.Attachment.Expires) - data["attachment_url"] = m.Attachment.URL - } - apnsConfig = createAPNSAlertConfig(m, data) - } else { // If "anonymous read" for a topic is not allowed, we cannot send the message along // via Firebase. Instead, we send a "poll_request" message, asking the client to poll. // @@ -180,23 +146,42 @@ func toFirebaseMessage(m *message, auther user.Auther) (*messaging.Message, erro // fields are set, the iOS app fails to decode the message. // // See https://github.com/binwiederhier/ntfy/pull/1345 - data = map[string]string{ - "id": m.ID, - "time": fmt.Sprintf("%d", m.Time), - "event": pollRequestEvent, - "topic": m.Topic, - "priority": fmt.Sprintf("%d", m.Priority), - "tags": "", - "click": "", - "icon": "", - "title": "", - "message": newMessageBody, - "content_type": m.ContentType, - "encoding": m.Encoding, - "poll_id": m.ID, + if err := auther.Authorize(nil, m.Topic, user.PermissionRead); err != nil { + m = toPollRequest(m) } - apnsConfig = createAPNSAlertConfig(m, data) } + data = map[string]string{ + "id": m.ID, + "time": fmt.Sprintf("%d", m.Time), + "event": m.Event, + "topic": m.Topic, + "priority": fmt.Sprintf("%d", m.Priority), + "tags": strings.Join(m.Tags, ","), + "click": m.Click, + "icon": m.Icon, + "title": m.Title, + "message": m.Message, + "content_type": m.ContentType, + "encoding": m.Encoding, + } + if len(m.Actions) > 0 { + actions, err := json.Marshal(m.Actions) + if err != nil { + return nil, err + } + data["actions"] = string(actions) + } + if m.Attachment != nil { + data["attachment_name"] = m.Attachment.Name + data["attachment_type"] = m.Attachment.Type + data["attachment_size"] = fmt.Sprintf("%d", m.Attachment.Size) + data["attachment_expires"] = fmt.Sprintf("%d", m.Attachment.Expires) + data["attachment_url"] = m.Attachment.URL + } + if m.PollID != "" { + data["poll_id"] = m.PollID + } + apnsConfig = createAPNSAlertConfig(m, data) } var androidConfig *messaging.AndroidConfig if m.Priority >= 4 { @@ -290,3 +275,17 @@ func maybeTruncateAPNSBodyMessage(s string) string { } return s } + +// toPollRequest converts a message to a poll request message. +// +// This empties all the fields that are not needed for a poll request and just sets the required fields, +// most importantly, the PollID. +func toPollRequest(m *message) *message { + pr := newPollRequestMessage(m.Topic, m.ID) + pr.ID = m.ID + pr.Time = m.Time + pr.Priority = m.Priority // Keep priority + pr.ContentType = m.ContentType + pr.Encoding = m.Encoding + return pr +} diff --git a/server/server_firebase_test.go b/server/server_firebase_test.go index 8d88fcf0..2f5b7287 100644 --- a/server/server_firebase_test.go +++ b/server/server_firebase_test.go @@ -240,6 +240,8 @@ func TestToFirebaseMessage_Message_Normal_Not_Allowed(t *testing.T) { "content_type": "", "poll_id": m.ID, }, fbm.Data) + require.Equal(t, "", fbm.APNS.Payload.Aps.Alert.Title) + require.Equal(t, "New message", fbm.APNS.Payload.Aps.Alert.Body) } func TestToFirebaseMessage_PollRequest(t *testing.T) { From 0de1990c0115f04620f73b9106830397fc8f4f64 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 25 May 2025 12:23:02 -0400 Subject: [PATCH 109/117] Increase number of access tokens per user to 60 --- docs/config.md | 2 +- docs/releases.md | 1 + user/manager.go | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/config.md b/docs/config.md index 2cfda9a6..d68ddb27 100644 --- a/docs/config.md +++ b/docs/config.md @@ -295,7 +295,7 @@ want to use a dedicated token to publish from your backup host, and one from you but not yet implemented. The `ntfy token` command can be used to manage access tokens for users. Tokens can have labels, and they can expire -automatically (or never expire). Each user can have up to 20 tokens (hardcoded). +automatically (or never expire). Each user can have up to 60 tokens (hardcoded). **Example commands** (type `ntfy token --help` or `ntfy token COMMAND --help` for more details): ``` diff --git a/docs/releases.md b/docs/releases.md index dabe9c2b..1ef7235c 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1397,6 +1397,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * WebSocket returning incorrect HTTP error code ([#1338](https://github.com/binwiederhier/ntfy/pull/1338) / [#1337](https://github.com/binwiederhier/ntfy/pull/1337), thanks to [@wunter8](https://github.com/wunter8) for debugging and implementing) * Make Markdown in the web app scrollable horizontally ([#1262](https://github.com/binwiederhier/ntfy/pull/1262), thanks to [@rake5k](https://github.com/rake5k) for fixing) * Make sure WebPush subscription topics are actually deleted (no ticket) +* Increase the number of access tokens per user to 60 ([#1308](https://github.com/binwiederhier/ntfy/issues/1308)) **Documentation:** diff --git a/user/manager.go b/user/manager.go index 59c8d51f..814ee827 100644 --- a/user/manager.go +++ b/user/manager.go @@ -28,7 +28,7 @@ const ( userHardDeleteAfterDuration = 7 * 24 * time.Hour tokenPrefix = "tk_" tokenLength = 32 - tokenMaxCount = 20 // Only keep this many tokens in the table per user + tokenMaxCount = 60 // Only keep this many tokens in the table per user tag = "user_manager" ) From 42af71e546eb99f5385958d4faea14ca2ead67ec Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 25 May 2025 12:27:21 -0400 Subject: [PATCH 110/117] Fix test --- user/manager_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/user/manager_test.go b/user/manager_test.go index c81b8cab..35994b47 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -678,10 +678,10 @@ func TestManager_Token_MaxCount_AutoDelete(t *testing.T) { require.NotEmpty(t, token.Value) philTokens = append(philTokens, token.Value) - // Create 22 tokens for ben (only 20 allowed!) + // Create 62 tokens for ben (only 60 allowed!) baseTime := time.Now().Add(24 * time.Hour) benTokens := make([]string, 0) - for i := 0; i < 22; i++ { // + for i := 0; i < 62; i++ { // token, err := a.CreateToken(ben.ID, "", time.Now().Add(72*time.Hour), netip.IPv4Unspecified()) require.Nil(t, err) require.NotEmpty(t, token.Value) @@ -700,7 +700,7 @@ func TestManager_Token_MaxCount_AutoDelete(t *testing.T) { require.Equal(t, ErrUnauthenticated, err) // Ben: The other tokens should still work - for i := 2; i < 22; i++ { + for i := 2; i < 62; i++ { userWithToken, err := a.AuthenticateToken(benTokens[i]) require.Nil(t, err, "token[%d]=%s failed", i, benTokens[i]) require.Equal(t, "ben", userWithToken.Name) @@ -720,7 +720,7 @@ func TestManager_Token_MaxCount_AutoDelete(t *testing.T) { require.Nil(t, err) require.True(t, rows.Next()) require.Nil(t, rows.Scan(&benCount)) - require.Equal(t, 20, benCount) + require.Equal(t, 60, benCount) var philCount int rows, err = a.db.Query(`SELECT COUNT(*) FROM user_token WHERE user_id=?`, phil.ID) From 9f72eb804d393f89a3dba57098a9c7089c10edc4 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 25 May 2025 12:32:16 -0400 Subject: [PATCH 111/117] Computers are fast --- user/manager_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/manager_test.go b/user/manager_test.go index 35994b47..89f35e3c 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -14,7 +14,7 @@ import ( "time" ) -const minBcryptTimingMillis = int64(50) // Ideally should be >100ms, but this should also run on a Raspberry Pi without massive resources +const minBcryptTimingMillis = int64(40) // Ideally should be >100ms, but this should also run on a Raspberry Pi without massive resources func TestManager_FullScenario_Default_DenyAll(t *testing.T) { a := newTestManagerFromFile(t, filepath.Join(t.TempDir(), "user.db"), "", PermissionDenyAll, DefaultUserPasswordBcryptCost, DefaultUserStatsQueueWriterInterval) From 7f86108379dd6c1163fb0c1f68016edcddb4ea66 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 25 May 2025 12:57:02 -0400 Subject: [PATCH 112/117] Update docs --- docs/releases.md | 1 + docs/subscribe/cli.md | 44 ++++++++++++++++++++++++++++++++----------- scripts/postinst.sh | 11 ----------- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 1ef7235c..179c9d6a 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1384,6 +1384,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Allow using `NTFY_PASSWORD_HASH` in `ntfy user` command instead of raw password ([#1340](https://github.com/binwiederhier/ntfy/pull/1340), thanks to [@wunter8](https://github.com/wunter8) for implementing) * You can now change passwords via `v1/users` API ([#1267](https://github.com/binwiederhier/ntfy/pull/1267), thanks to [@wunter8](https://github.com/wunter8) for implementing) * Make WebPush subscription warning/expiry configurable, increase default to 55/60 days ([#1212](https://github.com/binwiederhier/ntfy/pull/1212), thanks to [@KuroSetsuna29](https://github.com/KuroSetsuna29)) +* Support [systemd user service](https://docs.ntfy.sh/subscribe/cli/#using-the-systemd-service) `ntfy-client.service` ([](https://github.com/binwiederhier/ntfy/pull/1002), thanks to [@dandersch](https://github.com/dandersch)) **Bug fixes + maintenance:** diff --git a/docs/subscribe/cli.md b/docs/subscribe/cli.md index 819ff6ab..78e160c8 100644 --- a/docs/subscribe/cli.md +++ b/docs/subscribe/cli.md @@ -190,6 +190,10 @@ Here's an example config file that subscribes to three different topics, executi === "~/.config/ntfy/client.yml (Linux)" ```yaml + default-host: https://ntfy.sh + default-user: phill + default-password: mypass + subscribe: - topic: echo-this command: 'echo "Message received: $message"' @@ -210,9 +214,12 @@ Here's an example config file that subscribes to three different topics, executi fi ``` - === "~/Library/Application Support/ntfy/client.yml (macOS)" ```yaml + default-host: https://ntfy.sh + default-user: phill + default-password: mypass + subscribe: - topic: echo-this command: 'echo "Message received: $message"' @@ -226,6 +233,10 @@ Here's an example config file that subscribes to three different topics, executi === "%AppData%\ntfy\client.yml (Windows)" ```yaml + default-host: https://ntfy.sh + default-user: phill + default-password: mypass + subscribe: - topic: echo-this command: 'echo Message received: %message%' @@ -264,19 +275,30 @@ will be used, otherwise, the subscription settings will override the defaults. ### Using the systemd service You can use the `ntfy-client` systemd services to subscribe to multiple topics just like in the example above. -You have the option of either enabling `ntfy-client` as a system service (see -[here](https://github.com/binwiederhier/ntfy/blob/main/client/ntfy-client.service)) -or user service (see [here](https://github.com/binwiederhier/ntfy/blob/main/client/user/ntfy-client.service)). -The services are automatically installed (but not started) if you install the deb/rpm/AUR package. -The system service ensures that ntfy is run at startup (useful for servers), -while the user service starts ntfy only after the user has logged in. The user service is recommended for personal machine use. -To configure `ntfy-client` as a system service it, edit `/etc/ntfy/client.yml` and run `sudo systemctl restart ntfy-client`. +You have the option of either enabling `ntfy-client` as a **system service** (see [here](https://github.com/binwiederhier/ntfy/blob/main/client/ntfy-client.service)) +or **user service** (see [here](https://github.com/binwiederhier/ntfy/blob/main/client/user/ntfy-client.service)). Neither system service nor user service are enabled or started by default, so you have to do that yourself. -To configure `ntfy-client` as a user service it, edit `~/.config/ntfy/client.yml` and run `systemctl --user restart ntfy-client` (without sudo). +**System service:** The `ntfy-client` systemd system service runs as the `ntfy` user. When enabled, it is started at system boot. To configure it as a system +service, edit `/etc/ntfy/client.yml` and then enable/start the service (as root), like so: -!!! info - The system service runs as user `ntfy`, meaning that typical Linux permission restrictions apply. It also means that the system service cannot run commands in your X session as the primary machine user (unlike the user service). +``` +sudo systemctl enable ntfy-client +sudo systemctl restart ntfy-client +``` + +The system service runs as user `ntfy`, meaning that typical Linux permission restrictions apply. It also means that the system service cannot run commands in your X session as the primary machine user (unlike the user service). + +**User service:** The `ntfy-client` user service is run when the user logs into their desktop environment. To enable/start it, edit `~/.config/ntfy/client.yml` and +run the following commands (without sudo!): + +``` +systemctl --user enable ntfy-client +systemctl --user restart ntfy-client +``` + +Unlike the system service, the user service can interact with the user's desktop environment, and run commands like `notify-send` to display desktop notifications. +It can also run commands that require access to the user's home directory, such as `gnome-calculator`. ### Authentication Depending on whether the server is configured to support [access control](../config.md#access-control), some topics diff --git a/scripts/postinst.sh b/scripts/postinst.sh index 6e706205..d923e7f8 100755 --- a/scripts/postinst.sh +++ b/scripts/postinst.sh @@ -40,16 +40,5 @@ if [ "$1" = "configure" ] || [ "$1" -ge 1 ]; then systemctl restart ntfy-client.service >/dev/null || true fi fi - - # inform user about systemd user service - echo - echo "------------------------------------------------------------------------" - echo "ntfy includes a systemd user service." - echo "To enable it, run following commands as your regular user (not as root):" - echo - echo " systemctl --user enable ntfy-client.service" - echo " systemctl --user start ntfy-client.service" - echo "------------------------------------------------------------------------" - echo fi fi From 635ec88c4fc769911c3aaf5de5fdccdf53612ecd Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 25 May 2025 15:28:59 -0400 Subject: [PATCH 113/117] Update release log --- docs/releases.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releases.md b/docs/releases.md index 179c9d6a..dd7cecb0 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1399,6 +1399,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Make Markdown in the web app scrollable horizontally ([#1262](https://github.com/binwiederhier/ntfy/pull/1262), thanks to [@rake5k](https://github.com/rake5k) for fixing) * Make sure WebPush subscription topics are actually deleted (no ticket) * Increase the number of access tokens per user to 60 ([#1308](https://github.com/binwiederhier/ntfy/issues/1308)) +* Allow specifying `cache` and `firebase` via JSON publishing ([#1119](https://github.com/binwiederhier/ntfy/issues/1119)/[#1123](https://github.com/binwiederhier/ntfy/pull/1123), thanks to [@stendler](https://github.com/stendler)) **Documentation:** From af176610532142682c2d2b3670cacb108d3fb583 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Sun, 25 May 2025 20:13:13 -0400 Subject: [PATCH 114/117] Typos, server.yml additions --- docs/releases.md | 6 +++--- server/server.yml | 10 +++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index dd7cecb0..292f8803 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -1381,10 +1381,10 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Write VAPID keys to file in `ntfy webpush --output-file` ([#1138](https://github.com/binwiederhier/ntfy/pull/1138), thanks to [@nogweii](https://github.com/nogweii)) * Add Docker major/minor version to image tags ([#1271](https://github.com/binwiederhier/ntfy/pull/1271), thanks to [@RoboMagus](https://github.com/RoboMagus)) * Add `latest` subscription param for grabbing just the most recent message ([#1216](https://github.com/binwiederhier/ntfy/pull/1216), thanks to [@wunter8](https://github.com/wunter8)) -* Allow using `NTFY_PASSWORD_HASH` in `ntfy user` command instead of raw password ([#1340](https://github.com/binwiederhier/ntfy/pull/1340), thanks to [@wunter8](https://github.com/wunter8) for implementing) + * Allow using `NTFY_PASSWORD_HASH` in `ntfy user` command instead of raw password ([#1340](https://github.com/binwiederhier/ntfy/pull/1340), thanks to [@Tom-Hubrecht](https://github.com/Tom-Hubrecht) for implementing) * You can now change passwords via `v1/users` API ([#1267](https://github.com/binwiederhier/ntfy/pull/1267), thanks to [@wunter8](https://github.com/wunter8) for implementing) * Make WebPush subscription warning/expiry configurable, increase default to 55/60 days ([#1212](https://github.com/binwiederhier/ntfy/pull/1212), thanks to [@KuroSetsuna29](https://github.com/KuroSetsuna29)) -* Support [systemd user service](https://docs.ntfy.sh/subscribe/cli/#using-the-systemd-service) `ntfy-client.service` ([](https://github.com/binwiederhier/ntfy/pull/1002), thanks to [@dandersch](https://github.com/dandersch)) +* Support [systemd user service](https://docs.ntfy.sh/subscribe/cli/#using-the-systemd-service) `ntfy-client.service` ([#1002](https://github.com/binwiederhier/ntfy/pull/1002), thanks to [@dandersch](https://github.com/dandersch)) **Bug fixes + maintenance:** @@ -1419,7 +1419,7 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release * Typo in CLI docs ([#1172](https://github.com/binwiederhier/ntfy/pull/1172), thanks to [@anirvan](https://github.com/anirvan)) * Correction about MacroDroid ([#1137](https://github.com/binwiederhier/ntfy/pull/1137), thanks to [@ShlomoCode](https://github.com/ShlomoCode)) * Note about fail2ban in Docker ([#1175](https://github.com/binwiederhier/ntfy/pull/1175)), thanks to [@Measurity](https://github.com/Measurity)) -* Lots of other tiny docs updates, tanks to everyone who contributed! +* Lots of other tiny docs updates, thanks to everyone who contributed! **Languages** diff --git a/server/server.yml b/server/server.yml index 7329d37e..bb508cb4 100644 --- a/server/server.yml +++ b/server/server.yml @@ -146,7 +146,7 @@ # Web Push support (background notifications for browsers) # -# If enabled, allows ntfy to receive push notifications, even when the ntfy web app is closed. When enabled, users +# If enabled, allows the ntfy web app to receive push notifications, even when the web app is closed. When enabled, users # can enable background notifications in the web app. Once enabled, ntfy will forward published messages to the push # endpoint, which will then forward it to the browser. # @@ -155,15 +155,19 @@ # # - web-push-public-key is the generated VAPID public key, e.g. AA1234BBCCddvveekaabcdfqwertyuiopasdfghjklzxcvbnm1234567890 # - web-push-private-key is the generated VAPID private key, e.g. AA2BB1234567890abcdefzxcvbnm1234567890 -# - web-push-file is a database file to keep track of browser subscription endpoints, e.g. `/var/cache/ntfy/webpush.db` -# - web-push-email-address is the admin email address send to the push provider, e.g. `sysadmin@example.com` +# - web-push-file is a database file to keep track of browser subscription endpoints, e.g. /var/cache/ntfy/webpush.db +# - web-push-email-address is the admin email address send to the push provider, e.g. sysadmin@example.com # - web-push-startup-queries is an optional list of queries to run on startup` +# - web-push-expiry-warning-duration defines the duration after which unused subscriptions are sent a warning (default is 55d`) +# - web-push-expiry-duration defines the duration after which unused subscriptions will expire (default is 60d) # # web-push-public-key: # web-push-private-key: # web-push-file: # web-push-email-address: # web-push-startup-queries: +# web-push-expiry-warning-duration: "55d" +# web-push-expiry-duration: "60d" # If enabled, ntfy can perform voice calls via Twilio via the "X-Call" header. # From b4f15ec9d4d4f69f5cb0e07605079a7f170626f2 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Mon, 26 May 2025 13:41:26 -0400 Subject: [PATCH 115/117] Integrations --- docs/integrations.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/integrations.md b/docs/integrations.md index 7452c70d..c7da21f9 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -40,6 +40,8 @@ I've added a ⭐ to projects or posts that have a significant following, or had - [HetrixTools](https://docs.hetrixtools.com/ntfy-sh-notifications/) - Uptime monitoring - [EasyMorph](https://help.easymorph.com/doku.php?id=transformations:sendntfymessage) - Visual data transformation and automation tool - [Monibot](https://monibot.io/) - Monibot monitors your websites, servers and applications and notifies you if something goes wrong. +- [Miniflux](https://miniflux.app/docs/ntfy.html) - Minimalist and opinionated feed reader +- [Beszel](https://beszel.dev/guide/notifications/ntfy) - Server monitoring platform ## Integration via HTTP/SMTP/etc. @@ -83,7 +85,8 @@ I've added a ⭐ to projects or posts that have a significant following, or had ## CLIs + GUIs - [ntfy.sh.sh](https://github.com/mininmobile/ntfy.sh.sh) - Run scripts on ntfy.sh events -- [ntfy Desktop client](https://codeberg.org/zvava/ntfy-desktop) - Cross-platform desktop application for ntfy +- [ntfy-desktop](https://codeberg.org/zvava/ntfy-desktop) - Cross-platform desktop application for ntfy +- [ntfy-desktop](https://github.com/Aetherinox/ntfy-desktop) - Desktop client for Windows, Linux, and MacOS with push notifications - [ntfy svelte front-end](https://github.com/novatorem/Ntfy) - Front-end built with svelte - [wio-ntfy-ticker](https://github.com/nachotp/wio-ntfy-ticker) - Ticker display for a ntfy.sh topic - [ntfysh-windows](https://github.com/lucas-bortoli/ntfysh-windows) - A ntfy client for Windows Desktop @@ -174,6 +177,15 @@ I've added a ⭐ to projects or posts that have a significant following, or had ## Blog + forum posts +- [Device notifications via HTTP with ntfy](https://alistairshepherd.uk/writing/ntfy/) - alistairshepherd.uk - 6/2025 +- [Notifications about (almost) anything with ntfy.sh](https://hamatti.org/posts/notifications-about-almost-anything-with-ntfy-sh/) - hamatti.org - 6/2025 +- [I set up a self-hosted notification service for everything, and I'll never look back](https://www.xda-developers.com/set-up-self-hosted-notification-service/) ⭐ - xda-developers.com - 5/2025 +- [How to Set Up Ntfy: Self-Hosted Push Notifications Made Easy](https://www.youtube.com/watch?v=wDJDiAYZ3H0) - youtube.com (sass drew) - 1/2025 +- [The NTFY is a game-changer FREE solution for IT people](https://www.youtube.com/watch?v=NtlztHT-sRw) - youtube.com (Valters Tech Turf) - 1/2025 +- [Notify: A Powerful Tool for Real-Time Notifications (ntfy.sh)](https://www.youtube.com/watch?v=XXTTeVfGBz0) - youtube.com (LinuxCloudHacks) - 12/2025 +- [Push notifications with ntfy and n8n](https://www.youtube.com/watch?v=DKG1R3xYvwQ) - youtube.com (Oskar) - 10/2024 +- [Setup ntfy for selfhosted notifications with Cloudflare Tunnel](https://medium.com/@svenvanginkel/setup-ntfy-for-selfhosted-notifications-with-cloudflare-tunnel-e342f470177d) - medium.com (Sven van Ginkel) - 10/2024 +- [Self-Host NTFY - How It Works & Easy Setup Guide](https://www.youtube.com/watch?v=79wHc_jfrJE) ⭐ - youtube.com (Techdox)- 9/2024 - [ntfy / Emacs Lisp](https://speechcode.com/blog/ntfy/) - speechcode.com - 3/2024 - [Boost Your Productivity with ntfy.sh: The Ultimate Notification Tool for Command-Line Users](https://dev.to/archetypal/boost-your-productivity-with-ntfysh-the-ultimate-notification-tool-for-command-line-users-iil) - dev.to - 3/2024 - [Nextcloud Talk (F-Droid version) notifications using ntfy (ntfy.sh)](https://www.youtube.com/watch?v=0a6PpfN5PD8) - youtube.com - 2/2024 From 061677a78be6a365a90de29b9b190cbcf3d8c49c Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 29 May 2025 20:14:54 -0400 Subject: [PATCH 116/117] Bump version --- docs/install.md | 60 ++++++++++++------------- docs/releases.md | 113 +++++++++++++++++++++++++---------------------- 2 files changed, 90 insertions(+), 83 deletions(-) diff --git a/docs/install.md b/docs/install.md index 45870505..e71bac52 100644 --- a/docs/install.md +++ b/docs/install.md @@ -30,37 +30,37 @@ deb/rpm packages. === "x86_64/amd64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_amd64.tar.gz - tar zxvf ntfy_2.11.0_linux_amd64.tar.gz - sudo cp -a ntfy_2.11.0_linux_amd64/ntfy /usr/local/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.11.0_linux_amd64/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_amd64.tar.gz + tar zxvf ntfy_2.12.0_linux_amd64.tar.gz + sudo cp -a ntfy_2.12.0_linux_amd64/ntfy /usr/local/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.12.0_linux_amd64/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` === "armv6" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_armv6.tar.gz - tar zxvf ntfy_2.11.0_linux_armv6.tar.gz - sudo cp -a ntfy_2.11.0_linux_armv6/ntfy /usr/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.11.0_linux_armv6/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_armv6.tar.gz + tar zxvf ntfy_2.12.0_linux_armv6.tar.gz + sudo cp -a ntfy_2.12.0_linux_armv6/ntfy /usr/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.12.0_linux_armv6/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` === "armv7/armhf" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_armv7.tar.gz - tar zxvf ntfy_2.11.0_linux_armv7.tar.gz - sudo cp -a ntfy_2.11.0_linux_armv7/ntfy /usr/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.11.0_linux_armv7/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_armv7.tar.gz + tar zxvf ntfy_2.12.0_linux_armv7.tar.gz + sudo cp -a ntfy_2.12.0_linux_armv7/ntfy /usr/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.12.0_linux_armv7/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` === "arm64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_arm64.tar.gz - tar zxvf ntfy_2.11.0_linux_arm64.tar.gz - sudo cp -a ntfy_2.11.0_linux_arm64/ntfy /usr/bin/ntfy - sudo mkdir /etc/ntfy && sudo cp ntfy_2.11.0_linux_arm64/{client,server}/*.yml /etc/ntfy + wget https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_arm64.tar.gz + tar zxvf ntfy_2.12.0_linux_arm64.tar.gz + sudo cp -a ntfy_2.12.0_linux_arm64/ntfy /usr/bin/ntfy + sudo mkdir /etc/ntfy && sudo cp ntfy_2.12.0_linux_arm64/{client,server}/*.yml /etc/ntfy sudo ntfy serve ``` @@ -110,7 +110,7 @@ Manually installing the .deb file: === "x86_64/amd64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_amd64.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_amd64.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -118,7 +118,7 @@ Manually installing the .deb file: === "armv6" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_armv6.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_armv6.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -126,7 +126,7 @@ Manually installing the .deb file: === "armv7/armhf" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_armv7.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_armv7.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -134,7 +134,7 @@ Manually installing the .deb file: === "arm64" ```bash - wget https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_arm64.deb + wget https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_arm64.deb sudo dpkg -i ntfy_*.deb sudo systemctl enable ntfy sudo systemctl start ntfy @@ -144,28 +144,28 @@ Manually installing the .deb file: === "x86_64/amd64" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_amd64.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_amd64.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` === "armv6" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_armv6.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_armv6.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` === "armv7/armhf" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_armv7.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_armv7.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` === "arm64" ```bash - sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_linux_arm64.rpm + sudo rpm -ivh https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_linux_arm64.rpm sudo systemctl enable ntfy sudo systemctl start ntfy ``` @@ -195,18 +195,18 @@ NixOS also supports [declarative setup of the ntfy server](https://search.nixos. ## macOS The [ntfy CLI](subscribe/cli.md) (`ntfy publish` and `ntfy subscribe` only) is supported on macOS as well. -To install, please [download the tarball](https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_darwin_all.tar.gz), +To install, please [download the tarball](https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_darwin_all.tar.gz), extract it and place it somewhere in your `PATH` (e.g. `/usr/local/bin/ntfy`). If run as `root`, ntfy will look for its config at `/etc/ntfy/client.yml`. For all other users, it'll look for it at `~/Library/Application Support/ntfy/client.yml` (sample included in the tarball). ```bash -curl -L https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_darwin_all.tar.gz > ntfy_2.11.0_darwin_all.tar.gz -tar zxvf ntfy_2.11.0_darwin_all.tar.gz -sudo cp -a ntfy_2.11.0_darwin_all/ntfy /usr/local/bin/ntfy +curl -L https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_darwin_all.tar.gz > ntfy_2.12.0_darwin_all.tar.gz +tar zxvf ntfy_2.12.0_darwin_all.tar.gz +sudo cp -a ntfy_2.12.0_darwin_all/ntfy /usr/local/bin/ntfy mkdir ~/Library/Application\ Support/ntfy -cp ntfy_2.11.0_darwin_all/client/client.yml ~/Library/Application\ Support/ntfy/client.yml +cp ntfy_2.12.0_darwin_all/client/client.yml ~/Library/Application\ Support/ntfy/client.yml ntfy --help ``` @@ -224,7 +224,7 @@ brew install ntfy ## Windows The [ntfy CLI](subscribe/cli.md) (`ntfy publish` and `ntfy subscribe` only) is supported on Windows as well. -To install, please [download the latest ZIP](https://github.com/binwiederhier/ntfy/releases/download/v2.11.0/ntfy_2.11.0_windows_amd64.zip), +To install, please [download the latest ZIP](https://github.com/binwiederhier/ntfy/releases/download/v2.12.0/ntfy_2.12.0_windows_amd64.zip), extract it and place the `ntfy.exe` binary somewhere in your `%Path%`. The default path for the client config file is at `%AppData%\ntfy\client.yml` (not created automatically, sample in the ZIP file). diff --git a/docs/releases.md b/docs/releases.md index 292f8803..5004b866 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -2,6 +2,66 @@ Binaries for all releases can be found on the GitHub releases pages for the [ntfy server](https://github.com/binwiederhier/ntfy/releases) and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/releases). +### ntfy server v2.12.0 +Released May 29, 2025 + +This is mainly a maintenance release that updates dependencies, though since it's been over a year, there are a few +new features and bug fixes as well. + +Thanks to everyone who contributed to this release, and special thanks to [@wunter8](https://github.com/wunter8) for his continued +user support in Discord/Matrix/GitHub! You rock, man! + +**Features:** + +* Add username/password auth to email publishing ([#1164](https://github.com/binwiederhier/ntfy/pull/1164), thanks to [@bishtawi](https://github.com/bishtawi)) +* Write VAPID keys to file in `ntfy webpush --output-file` ([#1138](https://github.com/binwiederhier/ntfy/pull/1138), thanks to [@nogweii](https://github.com/nogweii)) +* Add Docker major/minor version to image tags ([#1271](https://github.com/binwiederhier/ntfy/pull/1271), thanks to [@RoboMagus](https://github.com/RoboMagus)) +* Add `latest` subscription param for grabbing just the most recent message ([#1216](https://github.com/binwiederhier/ntfy/pull/1216), thanks to [@wunter8](https://github.com/wunter8)) +* Allow using `NTFY_PASSWORD_HASH` in `ntfy user` command instead of raw password ([#1340](https://github.com/binwiederhier/ntfy/pull/1340), thanks to [@Tom-Hubrecht](https://github.com/Tom-Hubrecht) for implementing) +* You can now change passwords via `v1/users` API ([#1267](https://github.com/binwiederhier/ntfy/pull/1267), thanks to [@wunter8](https://github.com/wunter8) for implementing) +* Make WebPush subscription warning/expiry configurable, increase default to 55/60 days ([#1212](https://github.com/binwiederhier/ntfy/pull/1212), thanks to [@KuroSetsuna29](https://github.com/KuroSetsuna29)) +* Support [systemd user service](https://docs.ntfy.sh/subscribe/cli/#using-the-systemd-service) `ntfy-client.service` ([#1002](https://github.com/binwiederhier/ntfy/pull/1002), thanks to [@dandersch](https://github.com/dandersch)) + +**Bug fixes + maintenance:** + +* Security updates for dependencies and Docker images ([#1341](https://github.com/binwiederhier/ntfy/pull/1341)) +* Upgrade to Vite 6 ([#1342](https://github.com/binwiederhier/ntfy/pull/1342), thanks Dependabot) +* Fix iOS delivery issues for read-protected topics ([#1207](https://github.com/binwiederhier/ntfy/pull/1287), thanks a lot to [@barart](https://github.com/barart)!) +* Add `Date` header to outgoing emails to avoid rejection ([#1141](https://github.com/binwiederhier/ntfy/pull/1141), thanks to [@pcouy](https://github.com/pcouy)) +* Fix IP address parsing when behind a proxy ([#1266](https://github.com/binwiederhier/ntfy/pull/1266), thanks to [@mmatuska](https://github.com/mmatuska)) +* Make sure UnifiedPush messages are not treated as attachments ([#1312](https://github.com/binwiederhier/ntfy/pull/1312), thanks to [@vkrause](https://github.com/vkrause)) +* Add OCI image version to Docker image ([#1307](https://github.com/binwiederhier/ntfy/pull/1307), thanks to [@jlssmt](https://github.com/jlssmt)) +* WebSocket returning incorrect HTTP error code ([#1338](https://github.com/binwiederhier/ntfy/pull/1338) / [#1337](https://github.com/binwiederhier/ntfy/pull/1337), thanks to [@wunter8](https://github.com/wunter8) for debugging and implementing) +* Make Markdown in the web app scrollable horizontally ([#1262](https://github.com/binwiederhier/ntfy/pull/1262), thanks to [@rake5k](https://github.com/rake5k) for fixing) +* Make sure WebPush subscription topics are actually deleted (no ticket) +* Increase the number of access tokens per user to 60 ([#1308](https://github.com/binwiederhier/ntfy/issues/1308)) +* Allow specifying `cache` and `firebase` via JSON publishing ([#1119](https://github.com/binwiederhier/ntfy/issues/1119)/[#1123](https://github.com/binwiederhier/ntfy/pull/1123), thanks to [@stendler](https://github.com/stendler)) + +**Documentation:** + +* Lots of new integrations and projects. Amazing! + * [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) + * [UptimeObserver](https://uptimeobserver.com) + * [alertmanager-ntfy-relay](https://github.com/therobbielee/alertmanager-ntfy-relay) + * [Monibot](https://monibot.io/) + * [Daily_Fact_Ntfy](https://github.com/thiswillbeyourgithub/Daily_Fact_Ntfy) + * [EasyMorph](https://help.easymorph.com/doku.php?id=transformations:sendntfymessage) + * [ntfy-run](https://github.com/quantum5/ntfy-run) + * [Clipboard IO](https://github.com/jim3692/clipboard-io) + * [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) + * [InvaderInformant](https://github.com/patricksthannon/InvaderInformant) +* Various docs updates ([#1161](https://github.com/binwiederhier/ntfy/pull/1161), thanks to [@OneWeekNotice](https://github.com/OneWeekNotice)) +* Typo in config docs ([#1177](https://github.com/binwiederhier/ntfy/pull/1177), thanks to [@hoho4190](https://github.com/hoho4190)) +* Typo in CLI docs ([#1172](https://github.com/binwiederhier/ntfy/pull/1172), thanks to [@anirvan](https://github.com/anirvan)) +* Correction about MacroDroid ([#1137](https://github.com/binwiederhier/ntfy/pull/1137), thanks to [@ShlomoCode](https://github.com/ShlomoCode)) +* Note about fail2ban in Docker ([#1175](https://github.com/binwiederhier/ntfy/pull/1175)), thanks to [@Measurity](https://github.com/Measurity)) +* Lots of other tiny docs updates, thanks to everyone who contributed! + +**Languages** + +* Update new languages from Weblate. Thanks to all the contributors! +* Added Tamil (தமிழ்) as a new language to the web app + ### ntfy server v2.11.0 Released May 13, 2024 @@ -1373,59 +1433,6 @@ and the [ntfy Android app](https://github.com/binwiederhier/ntfy-android/release ## Not released yet -### ntfy server v2.12.0 (UNRELEASED) - -**Features:** - -* Add username/password auth to email publishing ([#1164](https://github.com/binwiederhier/ntfy/pull/1164), thanks to [@bishtawi](https://github.com/bishtawi)) -* Write VAPID keys to file in `ntfy webpush --output-file` ([#1138](https://github.com/binwiederhier/ntfy/pull/1138), thanks to [@nogweii](https://github.com/nogweii)) -* Add Docker major/minor version to image tags ([#1271](https://github.com/binwiederhier/ntfy/pull/1271), thanks to [@RoboMagus](https://github.com/RoboMagus)) -* Add `latest` subscription param for grabbing just the most recent message ([#1216](https://github.com/binwiederhier/ntfy/pull/1216), thanks to [@wunter8](https://github.com/wunter8)) - * Allow using `NTFY_PASSWORD_HASH` in `ntfy user` command instead of raw password ([#1340](https://github.com/binwiederhier/ntfy/pull/1340), thanks to [@Tom-Hubrecht](https://github.com/Tom-Hubrecht) for implementing) -* You can now change passwords via `v1/users` API ([#1267](https://github.com/binwiederhier/ntfy/pull/1267), thanks to [@wunter8](https://github.com/wunter8) for implementing) -* Make WebPush subscription warning/expiry configurable, increase default to 55/60 days ([#1212](https://github.com/binwiederhier/ntfy/pull/1212), thanks to [@KuroSetsuna29](https://github.com/KuroSetsuna29)) -* Support [systemd user service](https://docs.ntfy.sh/subscribe/cli/#using-the-systemd-service) `ntfy-client.service` ([#1002](https://github.com/binwiederhier/ntfy/pull/1002), thanks to [@dandersch](https://github.com/dandersch)) - -**Bug fixes + maintenance:** - -* Security updates for dependencies and Docker images ([#1341](https://github.com/binwiederhier/ntfy/pull/1341)) -* Upgrade to Vite 6 ([#1342](https://github.com/binwiederhier/ntfy/pull/1342), thanks Dependabot) -* Fix iOS delivery issues for read-protected topics ([#1207](https://github.com/binwiederhier/ntfy/pull/1287), thanks a lot to [@barart](https://github.com/barart)!) -* Add `Date` header to outgoing emails to avoid rejection ([#1141](https://github.com/binwiederhier/ntfy/pull/1141), thanks to [@pcouy](https://github.com/pcouy)) -* Fix IP address parsing when behind a proxy ([#1266](https://github.com/binwiederhier/ntfy/pull/1266), thanks to [@mmatuska](https://github.com/mmatuska)) -* Make sure UnifiedPush messages are not treated as attachments ([#1312](https://github.com/binwiederhier/ntfy/pull/1312), thanks to [@vkrause](https://github.com/vkrause)) -* Add OCI image version to Docker image ([#1307](https://github.com/binwiederhier/ntfy/pull/1307), thanks to [@jlssmt](https://github.com/jlssmt)) -* WebSocket returning incorrect HTTP error code ([#1338](https://github.com/binwiederhier/ntfy/pull/1338) / [#1337](https://github.com/binwiederhier/ntfy/pull/1337), thanks to [@wunter8](https://github.com/wunter8) for debugging and implementing) -* Make Markdown in the web app scrollable horizontally ([#1262](https://github.com/binwiederhier/ntfy/pull/1262), thanks to [@rake5k](https://github.com/rake5k) for fixing) -* Make sure WebPush subscription topics are actually deleted (no ticket) -* Increase the number of access tokens per user to 60 ([#1308](https://github.com/binwiederhier/ntfy/issues/1308)) -* Allow specifying `cache` and `firebase` via JSON publishing ([#1119](https://github.com/binwiederhier/ntfy/issues/1119)/[#1123](https://github.com/binwiederhier/ntfy/pull/1123), thanks to [@stendler](https://github.com/stendler)) - -**Documentation:** - -* Lots of new integrations and projects. Amazing! - * [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) - * [UptimeObserver](https://uptimeobserver.com) - * [alertmanager-ntfy-relay](https://github.com/therobbielee/alertmanager-ntfy-relay) - * [Monibot](https://monibot.io/) - * [Daily_Fact_Ntfy](https://github.com/thiswillbeyourgithub/Daily_Fact_Ntfy) - * [EasyMorph](https://help.easymorph.com/doku.php?id=transformations:sendntfymessage) - * [ntfy-run](https://github.com/quantum5/ntfy-run) - * [Clipboard IO](https://github.com/jim3692/clipboard-io) - * [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) - * [InvaderInformant](https://github.com/patricksthannon/InvaderInformant) -* Various docs updates ([#1161](https://github.com/binwiederhier/ntfy/pull/1161), thanks to [@OneWeekNotice](https://github.com/OneWeekNotice)) -* Typo in config docs ([#1177](https://github.com/binwiederhier/ntfy/pull/1177), thanks to [@hoho4190](https://github.com/hoho4190)) -* Typo in CLI docs ([#1172](https://github.com/binwiederhier/ntfy/pull/1172), thanks to [@anirvan](https://github.com/anirvan)) -* Correction about MacroDroid ([#1137](https://github.com/binwiederhier/ntfy/pull/1137), thanks to [@ShlomoCode](https://github.com/ShlomoCode)) -* Note about fail2ban in Docker ([#1175](https://github.com/binwiederhier/ntfy/pull/1175)), thanks to [@Measurity](https://github.com/Measurity)) -* Lots of other tiny docs updates, thanks to everyone who contributed! - -**Languages** - -* Update new languages from Weblate. Thanks to all the contributors! -* Added Tamil (தமிழ்) as a new language to the web app - ### ntfy Android app v1.16.1 (UNRELEASED) **Features:** From dc797f8594b32933b90fc7f0af69d7dd2a560ef9 Mon Sep 17 00:00:00 2001 From: binwiederhier Date: Thu, 29 May 2025 20:35:22 -0400 Subject: [PATCH 117/117] Fix release noteFix release notess --- docs/releases.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/releases.md b/docs/releases.md index 5004b866..a1035310 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -40,16 +40,16 @@ user support in Discord/Matrix/GitHub! You rock, man! **Documentation:** * Lots of new integrations and projects. Amazing! - * [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) - * [UptimeObserver](https://uptimeobserver.com) - * [alertmanager-ntfy-relay](https://github.com/therobbielee/alertmanager-ntfy-relay) - * [Monibot](https://monibot.io/) - * [Daily_Fact_Ntfy](https://github.com/thiswillbeyourgithub/Daily_Fact_Ntfy) - * [EasyMorph](https://help.easymorph.com/doku.php?id=transformations:sendntfymessage) - * [ntfy-run](https://github.com/quantum5/ntfy-run) - * [Clipboard IO](https://github.com/jim3692/clipboard-io) - * [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) - * [InvaderInformant](https://github.com/patricksthannon/InvaderInformant) + * [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) + * [UptimeObserver](https://uptimeobserver.com) + * [alertmanager-ntfy-relay](https://github.com/therobbielee/alertmanager-ntfy-relay) + * [Monibot](https://monibot.io/) + * [Daily_Fact_Ntfy](https://github.com/thiswillbeyourgithub/Daily_Fact_Ntfy) + * [EasyMorph](https://help.easymorph.com/doku.php?id=transformations:sendntfymessage) + * [ntfy-run](https://github.com/quantum5/ntfy-run) + * [Clipboard IO](https://github.com/jim3692/clipboard-io) + * [ntfy-me-mcp](https://github.com/gitmotion/ntfy-me-mcp) + * [InvaderInformant](https://github.com/patricksthannon/InvaderInformant) * Various docs updates ([#1161](https://github.com/binwiederhier/ntfy/pull/1161), thanks to [@OneWeekNotice](https://github.com/OneWeekNotice)) * Typo in config docs ([#1177](https://github.com/binwiederhier/ntfy/pull/1177), thanks to [@hoho4190](https://github.com/hoho4190)) * Typo in CLI docs ([#1172](https://github.com/binwiederhier/ntfy/pull/1172), thanks to [@anirvan](https://github.com/anirvan))