From 08483c70750bed8a086e4afd36360a2a4b65f63b Mon Sep 17 00:00:00 2001 From: Timo Knuth Date: Thu, 2 Apr 2026 11:39:57 +0200 Subject: [PATCH] Slefhostet und postgres --- .../Crashpad/throttle_store.dat | 2 +- .../Crashpad/throttle_store.dat | 2 +- .../Default/Extension Rules/CURRENT | 2 +- .../Default/Extension Rules/LOG | 4 +- .../Default/Extension Scripts/CURRENT | 2 +- .../Default/Extension Scripts/LOG | 4 +- .../Default/Extension State/CURRENT | 2 +- .../Default/Extension State/LOG | 4 +- .../Site Characteristics Database/CURRENT | 2 +- .../Default/Site Characteristics Database/LOG | 4 +- .../Default/Sync Data/LevelDB/CURRENT | 2 +- .../Default/Sync Data/LevelDB/LOG | 4 +- .../Default/shared_proto_db/CURRENT | 2 +- .../Default/shared_proto_db/LOG | 4 +- .../Default/shared_proto_db/metadata/CURRENT | 2 +- .../Default/shared_proto_db/metadata/LOG | 4 +- .../Crashpad/throttle_store.dat | 2 +- .../Default/Extension Rules/CURRENT | 2 +- .../Default/Extension Rules/LOG | 4 +- .../Default/Extension Scripts/CURRENT | 2 +- .../Default/Extension Scripts/LOG | 4 +- .../Default/Extension State/CURRENT | 2 +- .../Default/Extension State/LOG | 4 +- .../Site Characteristics Database/CURRENT | 2 +- .../Default/Site Characteristics Database/LOG | 4 +- .../Default/Sync Data/LevelDB/CURRENT | 2 +- .../Default/Sync Data/LevelDB/LOG | 4 +- .../Default/shared_proto_db/CURRENT | 2 +- .../Default/shared_proto_db/LOG | 4 +- .../Default/shared_proto_db/metadata/CURRENT | 2 +- .../Default/shared_proto_db/metadata/LOG | 4 +- .../Crashpad/throttle_store.dat | 2 +- .../Crashpad/throttle_store.dat | 2 +- .../EdgeCoupons/coupons_data.db/CURRENT | 2 +- .../Default/EdgeCoupons/coupons_data.db/LOG | 4 +- .../Default/Extension Rules/CURRENT | 2 +- .../Default/Extension Rules/LOG | 4 +- .../Default/Extension Scripts/CURRENT | 2 +- .../Default/Extension Scripts/LOG | 4 +- .../Default/Extension State/CURRENT | 2 +- .../Default/Extension State/LOG | 4 +- .../Site Characteristics Database/CURRENT | 2 +- .../Default/Site Characteristics Database/LOG | 4 +- .../Default/Sync Data/LevelDB/CURRENT | 2 +- .../Default/Sync Data/LevelDB/LOG | 4 +- .../Default/shared_proto_db/CURRENT | 2 +- .../Default/shared_proto_db/LOG | 4 +- .../Default/shared_proto_db/metadata/CURRENT | 2 +- .../Default/shared_proto_db/metadata/LOG | 4 +- .../Crashpad/throttle_store.dat | 2 +- .../Default/Extension Rules/CURRENT | 2 +- .../Default/Extension Rules/LOG | 4 +- .../Default/Extension Scripts/CURRENT | 2 +- .../Default/Extension Scripts/LOG | 4 +- .../Default/Extension State/CURRENT | 2 +- .../Default/Extension State/LOG | 4 +- .../Site Characteristics Database/CURRENT | 2 +- .../Default/Site Characteristics Database/LOG | 4 +- .../Default/Sync Data/LevelDB/CURRENT | 2 +- .../Default/Sync Data/LevelDB/LOG | 4 +- .../Default/shared_proto_db/CURRENT | 2 +- .../Default/shared_proto_db/LOG | 4 +- .../Default/shared_proto_db/metadata/CURRENT | 2 +- .../Default/shared_proto_db/metadata/LOG | 4 +- .../Crashpad/throttle_store.dat | 2 +- .../Default/Extension Rules/CURRENT | 2 +- .../Default/Extension Rules/LOG | 4 +- .../Default/Extension Scripts/CURRENT | 2 +- .../Default/Extension Scripts/LOG | 4 +- .../Default/Extension State/CURRENT | 2 +- .../Default/Extension State/LOG | 4 +- .../Site Characteristics Database/CURRENT | 2 +- .../Default/Site Characteristics Database/LOG | 4 +- .../Default/Sync Data/LevelDB/CURRENT | 2 +- .../Default/Sync Data/LevelDB/LOG | 4 +- .../Default/shared_proto_db/CURRENT | 2 +- .../Default/shared_proto_db/LOG | 4 +- .../Default/shared_proto_db/metadata/CURRENT | 2 +- .../Default/shared_proto_db/metadata/LOG | 4 +- .../Crashpad/throttle_store.dat | 2 +- .../Crashpad/throttle_store.dat | 2 +- .../Default/Asset Store/assets.db/CURRENT | 2 +- .../Default/Asset Store/assets.db/LOG | 4 +- .../EdgeCoupons/coupons_data.db/CURRENT | 2 +- .../Default/EdgeCoupons/coupons_data.db/LOG | 4 +- .../EntityExtractionAssetStore.db/CURRENT | 2 +- .../EntityExtractionAssetStore.db/LOG | 4 +- .../Default/Extension Rules/CURRENT | 2 +- .../Default/Extension Rules/LOG | 4 +- .../Default/Extension Scripts/CURRENT | 2 +- .../Default/Extension Scripts/LOG | 4 +- .../Default/Extension State/CURRENT | 2 +- .../Default/Extension State/LOG | 4 +- .../1.102.1_0/_locales/as/messages.json | 2 +- .../1.102.1_0/_locales/be/messages.json | 2 +- .../1.102.1_0/_locales/cy/messages.json | 2 +- .../1.102.1_0/_locales/eu/messages.json | 2 +- .../1.102.1_0/_locales/hy/messages.json | 2 +- .../1.102.1_0/_locales/is/messages.json | 2 +- .../1.102.1_0/_locales/iw/messages.json | 2 +- .../1.102.1_0/_locales/ka/messages.json | 2 +- .../1.102.1_0/_locales/kk/messages.json | 2 +- .../1.102.1_0/_locales/km/messages.json | 2 +- .../1.102.1_0/_locales/lo/messages.json | 2 +- .../1.102.1_0/_locales/mk/messages.json | 2 +- .../1.102.1_0/_locales/mn/messages.json | 2 +- .../1.102.1_0/_locales/my/messages.json | 2 +- .../1.102.1_0/_locales/or/messages.json | 2 +- .../1.102.1_0/_locales/pa/messages.json | 2 +- .../1.102.1_0/_locales/si/messages.json | 2 +- .../1.102.1_0/_locales/zh_HK/messages.json | 2 +- .../1.102.1_0/_locales/zu/messages.json | 2 +- .../1.102.1_0/dasherSettingSchema.json | 42 +- .../1.102.1_0/offscreendocument.html | 10 +- .../1.102.1_0/offscreendocument_main.js | 436 ++--- .../1.102.1_0/page_embed_script.js | 2 +- .../1.102.1_0/service_worker_bin_prod.js | 464 +++--- .../jdiccldimpdaibmpdkjnbmckianbfold/CURRENT | 2 +- .../jdiccldimpdaibmpdkjnbmckianbfold/LOG | 4 +- .../Default/Local Storage/leveldb/CURRENT | 2 +- .../Default/Local Storage/leveldb/LOG | 4 +- .../Default/Session Storage/CURRENT | 2 +- .../Default/Session Storage/LOG | 4 +- .../Site Characteristics Database/CURRENT | 2 +- .../Default/Site Characteristics Database/LOG | 4 +- .../def/Local Storage/leveldb/CURRENT | 2 +- .../def/Local Storage/leveldb/LOG | 4 +- .../def/Session Storage/CURRENT | 2 +- .../def/Session Storage/LOG | 4 +- .../Default/Sync Data/LevelDB/CURRENT | 2 +- .../Default/Sync Data/LevelDB/LOG | 4 +- .../Default/shared_proto_db/CURRENT | 2 +- .../Default/shared_proto_db/LOG | 4 +- .../Default/shared_proto_db/metadata/CURRENT | 2 +- .../Default/shared_proto_db/metadata/LOG | 4 +- .../Crashpad/throttle_store.dat | 2 +- .../EdgeCoupons/coupons_data.db/CURRENT | 2 +- .../Default/EdgeCoupons/coupons_data.db/LOG | 6 +- .../EdgeCoupons/coupons_data.db/LOG.old | 4 +- .../Default/Extension Rules/CURRENT | 2 +- .../Default/Extension Rules/LOG | 6 +- .../Default/Extension Rules/LOG.old | 4 +- .../Default/Extension Scripts/CURRENT | 2 +- .../Default/Extension Scripts/LOG | 6 +- .../Default/Extension Scripts/LOG.old | 4 +- .../Default/Extension State/CURRENT | 2 +- .../Default/Extension State/LOG | 6 +- .../Default/Extension State/LOG.old | 6 +- .../Site Characteristics Database/CURRENT | 2 +- .../Default/Site Characteristics Database/LOG | 6 +- .../Site Characteristics Database/LOG.old | 6 +- .../Default/Sync Data/LevelDB/CURRENT | 2 +- .../Default/Sync Data/LevelDB/LOG | 6 +- .../Default/Sync Data/LevelDB/LOG.old | 6 +- .../Default/shared_proto_db/CURRENT | 2 +- .../Default/shared_proto_db/LOG | 6 +- .../Default/shared_proto_db/LOG.old | 6 +- .../Default/shared_proto_db/metadata/CURRENT | 2 +- .../Default/shared_proto_db/metadata/LOG | 6 +- .../Default/shared_proto_db/metadata/LOG.old | 6 +- .edge-profile/Crashpad/throttle_store.dat | 2 +- .edge-profile/Default/Extension Rules/CURRENT | 2 +- .edge-profile/Default/Extension Rules/LOG | 4 +- .../Default/Extension Scripts/CURRENT | 2 +- .edge-profile/Default/Extension Scripts/LOG | 4 +- .edge-profile/Default/Extension State/CURRENT | 2 +- .edge-profile/Default/Extension State/LOG | 4 +- .../Site Characteristics Database/CURRENT | 2 +- .../Default/Site Characteristics Database/LOG | 4 +- .../Default/Sync Data/LevelDB/CURRENT | 2 +- .edge-profile/Default/Sync Data/LevelDB/LOG | 4 +- .edge-profile/Default/shared_proto_db/CURRENT | 2 +- .edge-profile/Default/shared_proto_db/LOG | 4 +- .../Default/shared_proto_db/metadata/CURRENT | 2 +- .../Default/shared_proto_db/metadata/LOG | 4 +- .env.example | 29 +- .mcp.json | 11 + CLAUDE.md | 194 ++- README.md | 279 ++-- __tests__/server/plantsSearch.test.js | 81 +- __tests__/services/mockBackendService.test.ts | 77 + app/_layout.tsx | 2 +- app/profile/billing.tsx | 117 +- components/CoachMarksOverlay.tsx | 572 +++---- context/AppContext.tsx | 87 +- docker-compose.yml | 165 +- eas.json | 42 +- greenlns-landing/Caddyfile | 18 + greenlns-landing/README.md | 77 +- greenlns-landing/app/robots.ts | 13 + greenlns-landing/app/sitemap.ts | 36 +- greenlns-landing/app/terms/page.tsx | 80 +- greenlns-landing/docker-compose.yml | 177 +- greenlns-landing/lib/site.ts | 12 +- greenlns-landing/next.config.ts | 24 +- greenlns-landing/public/robots.txt | 4 - railway.json | 12 +- scripts/render_social_videos.js | 1008 ++++++------ scripts/social-video-renderer.html | 572 +++---- server/Dockerfile | 24 +- server/index.js | 54 +- server/lib/auth.js | 76 +- server/lib/billing.js | 1099 +++++++------ server/lib/plants.js | 1462 +++++++++-------- server/lib/postgres.js | 93 ++ server/lib/sqlite.js | 87 +- server/package-lock.json | 1427 ++-------------- server/package.json | 20 +- server/scripts/download-plant-images.js | 26 +- services/authService.ts | 38 +- services/backend/backendApiClient.ts | 90 +- services/backend/contracts.ts | 6 + services/backend/mockBackendService.ts | 65 +- services/plantDatabaseService.ts | 11 +- utils/backendUrl.ts | 39 +- 215 files changed, 4584 insertions(+), 5190 deletions(-) create mode 100644 .mcp.json create mode 100644 greenlns-landing/Caddyfile create mode 100644 greenlns-landing/app/robots.ts delete mode 100644 greenlns-landing/public/robots.txt create mode 100644 server/lib/postgres.js diff --git a/.edge-profile-render-1774474489727/Crashpad/throttle_store.dat b/.edge-profile-render-1774474489727/Crashpad/throttle_store.dat index 9639e1b..53a4e73 100644 --- a/.edge-profile-render-1774474489727/Crashpad/throttle_store.dat +++ b/.edge-profile-render-1774474489727/Crashpad/throttle_store.dat @@ -1 +1 @@ -level=none expiry=0 +level=none expiry=0 diff --git a/.edge-profile-render-1774474676521/Crashpad/throttle_store.dat b/.edge-profile-render-1774474676521/Crashpad/throttle_store.dat index 9639e1b..53a4e73 100644 --- a/.edge-profile-render-1774474676521/Crashpad/throttle_store.dat +++ b/.edge-profile-render-1774474676521/Crashpad/throttle_store.dat @@ -1 +1 @@ -level=none expiry=0 +level=none expiry=0 diff --git a/.edge-profile-render-1774474676521/Default/Extension Rules/CURRENT b/.edge-profile-render-1774474676521/Default/Extension Rules/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474676521/Default/Extension Rules/CURRENT +++ b/.edge-profile-render-1774474676521/Default/Extension Rules/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Extension Rules/LOG b/.edge-profile-render-1774474676521/Default/Extension Rules/LOG index 24d253d..9483b0f 100644 --- a/.edge-profile-render-1774474676521/Default/Extension Rules/LOG +++ b/.edge-profile-render-1774474676521/Default/Extension Rules/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:37:57.357 37a0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension Rules since it was missing. -2026/03/25-16:37:57.368 37a0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension Rules/MANIFEST-000001 +2026/03/25-16:37:57.357 37a0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension Rules since it was missing. +2026/03/25-16:37:57.368 37a0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension Rules/MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774474676521/Default/Extension Scripts/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474676521/Default/Extension Scripts/CURRENT +++ b/.edge-profile-render-1774474676521/Default/Extension Scripts/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Extension Scripts/LOG b/.edge-profile-render-1774474676521/Default/Extension Scripts/LOG index ee28b5b..32652be 100644 --- a/.edge-profile-render-1774474676521/Default/Extension Scripts/LOG +++ b/.edge-profile-render-1774474676521/Default/Extension Scripts/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:37:57.376 37a0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension Scripts since it was missing. -2026/03/25-16:37:57.387 37a0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension Scripts/MANIFEST-000001 +2026/03/25-16:37:57.376 37a0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension Scripts since it was missing. +2026/03/25-16:37:57.387 37a0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension Scripts/MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Extension State/CURRENT b/.edge-profile-render-1774474676521/Default/Extension State/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474676521/Default/Extension State/CURRENT +++ b/.edge-profile-render-1774474676521/Default/Extension State/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Extension State/LOG b/.edge-profile-render-1774474676521/Default/Extension State/LOG index ff5af17..4093799 100644 --- a/.edge-profile-render-1774474676521/Default/Extension State/LOG +++ b/.edge-profile-render-1774474676521/Default/Extension State/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:37:59.253 3efc Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension State since it was missing. -2026/03/25-16:37:59.273 3efc Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension State/MANIFEST-000001 +2026/03/25-16:37:59.253 3efc Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension State since it was missing. +2026/03/25-16:37:59.273 3efc Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Extension State/MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774474676521/Default/Site Characteristics Database/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474676521/Default/Site Characteristics Database/CURRENT +++ b/.edge-profile-render-1774474676521/Default/Site Characteristics Database/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774474676521/Default/Site Characteristics Database/LOG index 88bb037..9638ed6 100644 --- a/.edge-profile-render-1774474676521/Default/Site Characteristics Database/LOG +++ b/.edge-profile-render-1774474676521/Default/Site Characteristics Database/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:37:57.272 4bac Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Site Characteristics Database since it was missing. -2026/03/25-16:37:57.290 4bac Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Site Characteristics Database/MANIFEST-000001 +2026/03/25-16:37:57.272 4bac Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Site Characteristics Database since it was missing. +2026/03/25-16:37:57.290 4bac Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Site Characteristics Database/MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/CURRENT +++ b/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/LOG index d955c8f..b0aca5a 100644 --- a/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/LOG +++ b/.edge-profile-render-1774474676521/Default/Sync Data/LevelDB/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:37:57.248 4844 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Sync Data\LevelDB since it was missing. -2026/03/25-16:37:57.264 4844 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Sync Data\LevelDB/MANIFEST-000001 +2026/03/25-16:37:57.248 4844 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Sync Data\LevelDB since it was missing. +2026/03/25-16:37:57.264 4844 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\Sync Data\LevelDB/MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774474676521/Default/shared_proto_db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474676521/Default/shared_proto_db/CURRENT +++ b/.edge-profile-render-1774474676521/Default/shared_proto_db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/LOG b/.edge-profile-render-1774474676521/Default/shared_proto_db/LOG index f147242..894f9e7 100644 --- a/.edge-profile-render-1774474676521/Default/shared_proto_db/LOG +++ b/.edge-profile-render-1774474676521/Default/shared_proto_db/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:37:58.774 4844 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\shared_proto_db since it was missing. -2026/03/25-16:37:58.797 4844 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\shared_proto_db/MANIFEST-000001 +2026/03/25-16:37:58.774 4844 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\shared_proto_db since it was missing. +2026/03/25-16:37:58.797 4844 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\shared_proto_db/MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/CURRENT +++ b/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/LOG index 4d8e7a2..478d932 100644 --- a/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/LOG +++ b/.edge-profile-render-1774474676521/Default/shared_proto_db/metadata/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:37:58.741 4844 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\shared_proto_db\metadata since it was missing. -2026/03/25-16:37:58.760 4844 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\shared_proto_db\metadata/MANIFEST-000001 +2026/03/25-16:37:58.741 4844 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\shared_proto_db\metadata since it was missing. +2026/03/25-16:37:58.760 4844 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474676521\Default\shared_proto_db\metadata/MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Crashpad/throttle_store.dat b/.edge-profile-render-1774474724122/Crashpad/throttle_store.dat index 9639e1b..53a4e73 100644 --- a/.edge-profile-render-1774474724122/Crashpad/throttle_store.dat +++ b/.edge-profile-render-1774474724122/Crashpad/throttle_store.dat @@ -1 +1 @@ -level=none expiry=0 +level=none expiry=0 diff --git a/.edge-profile-render-1774474724122/Default/Extension Rules/CURRENT b/.edge-profile-render-1774474724122/Default/Extension Rules/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474724122/Default/Extension Rules/CURRENT +++ b/.edge-profile-render-1774474724122/Default/Extension Rules/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Extension Rules/LOG b/.edge-profile-render-1774474724122/Default/Extension Rules/LOG index 663e809..2723807 100644 --- a/.edge-profile-render-1774474724122/Default/Extension Rules/LOG +++ b/.edge-profile-render-1774474724122/Default/Extension Rules/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:38:46.229 419c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension Rules since it was missing. -2026/03/25-16:38:46.249 419c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension Rules/MANIFEST-000001 +2026/03/25-16:38:46.229 419c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension Rules since it was missing. +2026/03/25-16:38:46.249 419c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension Rules/MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774474724122/Default/Extension Scripts/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474724122/Default/Extension Scripts/CURRENT +++ b/.edge-profile-render-1774474724122/Default/Extension Scripts/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Extension Scripts/LOG b/.edge-profile-render-1774474724122/Default/Extension Scripts/LOG index 3aa487b..e50e5d0 100644 --- a/.edge-profile-render-1774474724122/Default/Extension Scripts/LOG +++ b/.edge-profile-render-1774474724122/Default/Extension Scripts/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:38:46.264 419c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension Scripts since it was missing. -2026/03/25-16:38:46.287 419c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension Scripts/MANIFEST-000001 +2026/03/25-16:38:46.264 419c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension Scripts since it was missing. +2026/03/25-16:38:46.287 419c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension Scripts/MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Extension State/CURRENT b/.edge-profile-render-1774474724122/Default/Extension State/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474724122/Default/Extension State/CURRENT +++ b/.edge-profile-render-1774474724122/Default/Extension State/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Extension State/LOG b/.edge-profile-render-1774474724122/Default/Extension State/LOG index f735083..4ec3de6 100644 --- a/.edge-profile-render-1774474724122/Default/Extension State/LOG +++ b/.edge-profile-render-1774474724122/Default/Extension State/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:38:47.835 5b20 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension State since it was missing. -2026/03/25-16:38:47.851 5b20 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension State/MANIFEST-000001 +2026/03/25-16:38:47.835 5b20 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension State since it was missing. +2026/03/25-16:38:47.851 5b20 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Extension State/MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774474724122/Default/Site Characteristics Database/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474724122/Default/Site Characteristics Database/CURRENT +++ b/.edge-profile-render-1774474724122/Default/Site Characteristics Database/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774474724122/Default/Site Characteristics Database/LOG index 238e628..c8da5a4 100644 --- a/.edge-profile-render-1774474724122/Default/Site Characteristics Database/LOG +++ b/.edge-profile-render-1774474724122/Default/Site Characteristics Database/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:38:45.949 23f8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Site Characteristics Database since it was missing. -2026/03/25-16:38:45.965 23f8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Site Characteristics Database/MANIFEST-000001 +2026/03/25-16:38:45.949 23f8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Site Characteristics Database since it was missing. +2026/03/25-16:38:45.965 23f8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Site Characteristics Database/MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/CURRENT +++ b/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/LOG index 515c5d7..0ab8949 100644 --- a/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/LOG +++ b/.edge-profile-render-1774474724122/Default/Sync Data/LevelDB/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:38:45.906 4d24 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Sync Data\LevelDB since it was missing. -2026/03/25-16:38:45.932 4d24 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Sync Data\LevelDB/MANIFEST-000001 +2026/03/25-16:38:45.906 4d24 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Sync Data\LevelDB since it was missing. +2026/03/25-16:38:45.932 4d24 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\Sync Data\LevelDB/MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774474724122/Default/shared_proto_db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474724122/Default/shared_proto_db/CURRENT +++ b/.edge-profile-render-1774474724122/Default/shared_proto_db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/LOG b/.edge-profile-render-1774474724122/Default/shared_proto_db/LOG index 9ec4a15..bb337e6 100644 --- a/.edge-profile-render-1774474724122/Default/shared_proto_db/LOG +++ b/.edge-profile-render-1774474724122/Default/shared_proto_db/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:38:47.519 5b20 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\shared_proto_db since it was missing. -2026/03/25-16:38:47.536 5b20 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\shared_proto_db/MANIFEST-000001 +2026/03/25-16:38:47.519 5b20 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\shared_proto_db since it was missing. +2026/03/25-16:38:47.536 5b20 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\shared_proto_db/MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/CURRENT +++ b/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/LOG index 4d4c8a1..3d87a61 100644 --- a/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/LOG +++ b/.edge-profile-render-1774474724122/Default/shared_proto_db/metadata/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:38:47.487 5b20 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\shared_proto_db\metadata since it was missing. -2026/03/25-16:38:47.504 5b20 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\shared_proto_db\metadata/MANIFEST-000001 +2026/03/25-16:38:47.487 5b20 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\shared_proto_db\metadata since it was missing. +2026/03/25-16:38:47.504 5b20 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474724122\Default\shared_proto_db\metadata/MANIFEST-000001 diff --git a/.edge-profile-render-1774474761516/Crashpad/throttle_store.dat b/.edge-profile-render-1774474761516/Crashpad/throttle_store.dat index 9639e1b..53a4e73 100644 --- a/.edge-profile-render-1774474761516/Crashpad/throttle_store.dat +++ b/.edge-profile-render-1774474761516/Crashpad/throttle_store.dat @@ -1 +1 @@ -level=none expiry=0 +level=none expiry=0 diff --git a/.edge-profile-render-1774474922711/Crashpad/throttle_store.dat b/.edge-profile-render-1774474922711/Crashpad/throttle_store.dat index 9639e1b..53a4e73 100644 --- a/.edge-profile-render-1774474922711/Crashpad/throttle_store.dat +++ b/.edge-profile-render-1774474922711/Crashpad/throttle_store.dat @@ -1 +1 @@ -level=none expiry=0 +level=none expiry=0 diff --git a/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/CURRENT b/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/CURRENT +++ b/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/LOG b/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/LOG index e79f046..7c26885 100644 --- a/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/LOG +++ b/.edge-profile-render-1774474922711/Default/EdgeCoupons/coupons_data.db/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:42:11.050 3eb0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\EdgeCoupons/coupons_data.db since it was missing. -2026/03/25-16:42:11.060 3eb0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\EdgeCoupons/coupons_data.db/MANIFEST-000001 +2026/03/25-16:42:11.050 3eb0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\EdgeCoupons/coupons_data.db since it was missing. +2026/03/25-16:42:11.060 3eb0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\EdgeCoupons/coupons_data.db/MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Extension Rules/CURRENT b/.edge-profile-render-1774474922711/Default/Extension Rules/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474922711/Default/Extension Rules/CURRENT +++ b/.edge-profile-render-1774474922711/Default/Extension Rules/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Extension Rules/LOG b/.edge-profile-render-1774474922711/Default/Extension Rules/LOG index 7d94a5f..c2b2c74 100644 --- a/.edge-profile-render-1774474922711/Default/Extension Rules/LOG +++ b/.edge-profile-render-1774474922711/Default/Extension Rules/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:42:04.411 5294 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension Rules since it was missing. -2026/03/25-16:42:04.436 5294 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension Rules/MANIFEST-000001 +2026/03/25-16:42:04.411 5294 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension Rules since it was missing. +2026/03/25-16:42:04.436 5294 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension Rules/MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774474922711/Default/Extension Scripts/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474922711/Default/Extension Scripts/CURRENT +++ b/.edge-profile-render-1774474922711/Default/Extension Scripts/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Extension Scripts/LOG b/.edge-profile-render-1774474922711/Default/Extension Scripts/LOG index e53d36d..b6c38d7 100644 --- a/.edge-profile-render-1774474922711/Default/Extension Scripts/LOG +++ b/.edge-profile-render-1774474922711/Default/Extension Scripts/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:42:04.453 5294 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension Scripts since it was missing. -2026/03/25-16:42:04.476 5294 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension Scripts/MANIFEST-000001 +2026/03/25-16:42:04.453 5294 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension Scripts since it was missing. +2026/03/25-16:42:04.476 5294 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension Scripts/MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Extension State/CURRENT b/.edge-profile-render-1774474922711/Default/Extension State/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474922711/Default/Extension State/CURRENT +++ b/.edge-profile-render-1774474922711/Default/Extension State/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Extension State/LOG b/.edge-profile-render-1774474922711/Default/Extension State/LOG index b2f2c07..12cd312 100644 --- a/.edge-profile-render-1774474922711/Default/Extension State/LOG +++ b/.edge-profile-render-1774474922711/Default/Extension State/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:42:06.217 22a0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension State since it was missing. -2026/03/25-16:42:06.234 22a0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension State/MANIFEST-000001 +2026/03/25-16:42:06.217 22a0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension State since it was missing. +2026/03/25-16:42:06.234 22a0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Extension State/MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774474922711/Default/Site Characteristics Database/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474922711/Default/Site Characteristics Database/CURRENT +++ b/.edge-profile-render-1774474922711/Default/Site Characteristics Database/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774474922711/Default/Site Characteristics Database/LOG index d74a780..c24dea9 100644 --- a/.edge-profile-render-1774474922711/Default/Site Characteristics Database/LOG +++ b/.edge-profile-render-1774474922711/Default/Site Characteristics Database/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:42:04.221 4a08 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Site Characteristics Database since it was missing. -2026/03/25-16:42:04.264 4a08 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Site Characteristics Database/MANIFEST-000001 +2026/03/25-16:42:04.221 4a08 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Site Characteristics Database since it was missing. +2026/03/25-16:42:04.264 4a08 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Site Characteristics Database/MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/CURRENT +++ b/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/LOG index cf96ad9..cef1133 100644 --- a/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/LOG +++ b/.edge-profile-render-1774474922711/Default/Sync Data/LevelDB/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:42:04.187 22a0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Sync Data\LevelDB since it was missing. -2026/03/25-16:42:04.213 22a0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Sync Data\LevelDB/MANIFEST-000001 +2026/03/25-16:42:04.187 22a0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Sync Data\LevelDB since it was missing. +2026/03/25-16:42:04.213 22a0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\Sync Data\LevelDB/MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774474922711/Default/shared_proto_db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474922711/Default/shared_proto_db/CURRENT +++ b/.edge-profile-render-1774474922711/Default/shared_proto_db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/LOG b/.edge-profile-render-1774474922711/Default/shared_proto_db/LOG index bdff907..acef312 100644 --- a/.edge-profile-render-1774474922711/Default/shared_proto_db/LOG +++ b/.edge-profile-render-1774474922711/Default/shared_proto_db/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:42:05.883 bb8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\shared_proto_db since it was missing. -2026/03/25-16:42:05.905 bb8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\shared_proto_db/MANIFEST-000001 +2026/03/25-16:42:05.883 bb8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\shared_proto_db since it was missing. +2026/03/25-16:42:05.905 bb8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\shared_proto_db/MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/CURRENT +++ b/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/LOG index 5b45c4a..3665841 100644 --- a/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/LOG +++ b/.edge-profile-render-1774474922711/Default/shared_proto_db/metadata/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:42:05.851 bb8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\shared_proto_db\metadata since it was missing. -2026/03/25-16:42:05.867 bb8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\shared_proto_db\metadata/MANIFEST-000001 +2026/03/25-16:42:05.851 bb8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\shared_proto_db\metadata since it was missing. +2026/03/25-16:42:05.867 bb8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774474922711\Default\shared_proto_db\metadata/MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Crashpad/throttle_store.dat b/.edge-profile-render-1774475451193/Crashpad/throttle_store.dat index 9639e1b..53a4e73 100644 --- a/.edge-profile-render-1774475451193/Crashpad/throttle_store.dat +++ b/.edge-profile-render-1774475451193/Crashpad/throttle_store.dat @@ -1 +1 @@ -level=none expiry=0 +level=none expiry=0 diff --git a/.edge-profile-render-1774475451193/Default/Extension Rules/CURRENT b/.edge-profile-render-1774475451193/Default/Extension Rules/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475451193/Default/Extension Rules/CURRENT +++ b/.edge-profile-render-1774475451193/Default/Extension Rules/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Extension Rules/LOG b/.edge-profile-render-1774475451193/Default/Extension Rules/LOG index 4e48b9f..7ca67f8 100644 --- a/.edge-profile-render-1774475451193/Default/Extension Rules/LOG +++ b/.edge-profile-render-1774475451193/Default/Extension Rules/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:50:55.903 402c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension Rules since it was missing. -2026/03/25-16:50:55.948 402c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension Rules/MANIFEST-000001 +2026/03/25-16:50:55.903 402c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension Rules since it was missing. +2026/03/25-16:50:55.948 402c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension Rules/MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774475451193/Default/Extension Scripts/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475451193/Default/Extension Scripts/CURRENT +++ b/.edge-profile-render-1774475451193/Default/Extension Scripts/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Extension Scripts/LOG b/.edge-profile-render-1774475451193/Default/Extension Scripts/LOG index a840c37..37c7f08 100644 --- a/.edge-profile-render-1774475451193/Default/Extension Scripts/LOG +++ b/.edge-profile-render-1774475451193/Default/Extension Scripts/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:50:56.024 402c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension Scripts since it was missing. -2026/03/25-16:50:56.133 402c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension Scripts/MANIFEST-000001 +2026/03/25-16:50:56.024 402c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension Scripts since it was missing. +2026/03/25-16:50:56.133 402c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension Scripts/MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Extension State/CURRENT b/.edge-profile-render-1774475451193/Default/Extension State/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475451193/Default/Extension State/CURRENT +++ b/.edge-profile-render-1774475451193/Default/Extension State/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Extension State/LOG b/.edge-profile-render-1774475451193/Default/Extension State/LOG index 742feaa..54d254c 100644 --- a/.edge-profile-render-1774475451193/Default/Extension State/LOG +++ b/.edge-profile-render-1774475451193/Default/Extension State/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:50:58.206 1e44 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension State since it was missing. -2026/03/25-16:50:58.240 1e44 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension State/MANIFEST-000001 +2026/03/25-16:50:58.206 1e44 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension State since it was missing. +2026/03/25-16:50:58.240 1e44 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Extension State/MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774475451193/Default/Site Characteristics Database/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475451193/Default/Site Characteristics Database/CURRENT +++ b/.edge-profile-render-1774475451193/Default/Site Characteristics Database/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774475451193/Default/Site Characteristics Database/LOG index aba0235..a5f3047 100644 --- a/.edge-profile-render-1774475451193/Default/Site Characteristics Database/LOG +++ b/.edge-profile-render-1774475451193/Default/Site Characteristics Database/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:50:55.765 2df0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Site Characteristics Database since it was missing. -2026/03/25-16:50:55.920 2df0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Site Characteristics Database/MANIFEST-000001 +2026/03/25-16:50:55.765 2df0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Site Characteristics Database since it was missing. +2026/03/25-16:50:55.920 2df0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Site Characteristics Database/MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/CURRENT +++ b/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/LOG index 4e3d6fc..4ec60b7 100644 --- a/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/LOG +++ b/.edge-profile-render-1774475451193/Default/Sync Data/LevelDB/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:50:55.665 5894 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Sync Data\LevelDB since it was missing. -2026/03/25-16:50:55.763 5894 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Sync Data\LevelDB/MANIFEST-000001 +2026/03/25-16:50:55.665 5894 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Sync Data\LevelDB since it was missing. +2026/03/25-16:50:55.763 5894 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\Sync Data\LevelDB/MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774475451193/Default/shared_proto_db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475451193/Default/shared_proto_db/CURRENT +++ b/.edge-profile-render-1774475451193/Default/shared_proto_db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/LOG b/.edge-profile-render-1774475451193/Default/shared_proto_db/LOG index 4009c1b..7e34866 100644 --- a/.edge-profile-render-1774475451193/Default/shared_proto_db/LOG +++ b/.edge-profile-render-1774475451193/Default/shared_proto_db/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:50:57.605 47d8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\shared_proto_db since it was missing. -2026/03/25-16:50:57.701 47d8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\shared_proto_db/MANIFEST-000001 +2026/03/25-16:50:57.605 47d8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\shared_proto_db since it was missing. +2026/03/25-16:50:57.701 47d8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\shared_proto_db/MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/CURRENT +++ b/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/LOG index de207eb..2f51bc0 100644 --- a/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/LOG +++ b/.edge-profile-render-1774475451193/Default/shared_proto_db/metadata/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:50:57.553 47d8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\shared_proto_db\metadata since it was missing. -2026/03/25-16:50:57.582 47d8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\shared_proto_db\metadata/MANIFEST-000001 +2026/03/25-16:50:57.553 47d8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\shared_proto_db\metadata since it was missing. +2026/03/25-16:50:57.582 47d8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475451193\Default\shared_proto_db\metadata/MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Crashpad/throttle_store.dat b/.edge-profile-render-1774475972382/Crashpad/throttle_store.dat index 9639e1b..53a4e73 100644 --- a/.edge-profile-render-1774475972382/Crashpad/throttle_store.dat +++ b/.edge-profile-render-1774475972382/Crashpad/throttle_store.dat @@ -1 +1 @@ -level=none expiry=0 +level=none expiry=0 diff --git a/.edge-profile-render-1774475972382/Default/Extension Rules/CURRENT b/.edge-profile-render-1774475972382/Default/Extension Rules/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475972382/Default/Extension Rules/CURRENT +++ b/.edge-profile-render-1774475972382/Default/Extension Rules/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Extension Rules/LOG b/.edge-profile-render-1774475972382/Default/Extension Rules/LOG index 0d65558..5558b45 100644 --- a/.edge-profile-render-1774475972382/Default/Extension Rules/LOG +++ b/.edge-profile-render-1774475972382/Default/Extension Rules/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:59:38.111 49dc Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension Rules since it was missing. -2026/03/25-16:59:38.300 49dc Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension Rules/MANIFEST-000001 +2026/03/25-16:59:38.111 49dc Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension Rules since it was missing. +2026/03/25-16:59:38.300 49dc Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension Rules/MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774475972382/Default/Extension Scripts/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475972382/Default/Extension Scripts/CURRENT +++ b/.edge-profile-render-1774475972382/Default/Extension Scripts/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Extension Scripts/LOG b/.edge-profile-render-1774475972382/Default/Extension Scripts/LOG index 8026672..5ec8d5d 100644 --- a/.edge-profile-render-1774475972382/Default/Extension Scripts/LOG +++ b/.edge-profile-render-1774475972382/Default/Extension Scripts/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:59:38.512 49dc Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension Scripts since it was missing. -2026/03/25-16:59:38.667 49dc Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension Scripts/MANIFEST-000001 +2026/03/25-16:59:38.512 49dc Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension Scripts since it was missing. +2026/03/25-16:59:38.667 49dc Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension Scripts/MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Extension State/CURRENT b/.edge-profile-render-1774475972382/Default/Extension State/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475972382/Default/Extension State/CURRENT +++ b/.edge-profile-render-1774475972382/Default/Extension State/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Extension State/LOG b/.edge-profile-render-1774475972382/Default/Extension State/LOG index d24a890..afacb6a 100644 --- a/.edge-profile-render-1774475972382/Default/Extension State/LOG +++ b/.edge-profile-render-1774475972382/Default/Extension State/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:59:40.526 1678 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension State since it was missing. -2026/03/25-16:59:40.560 1678 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension State/MANIFEST-000001 +2026/03/25-16:59:40.526 1678 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension State since it was missing. +2026/03/25-16:59:40.560 1678 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Extension State/MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774475972382/Default/Site Characteristics Database/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475972382/Default/Site Characteristics Database/CURRENT +++ b/.edge-profile-render-1774475972382/Default/Site Characteristics Database/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774475972382/Default/Site Characteristics Database/LOG index 763334a..f960728 100644 --- a/.edge-profile-render-1774475972382/Default/Site Characteristics Database/LOG +++ b/.edge-profile-render-1774475972382/Default/Site Characteristics Database/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:59:37.884 20e4 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Site Characteristics Database since it was missing. -2026/03/25-16:59:38.214 20e4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Site Characteristics Database/MANIFEST-000001 +2026/03/25-16:59:37.884 20e4 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Site Characteristics Database since it was missing. +2026/03/25-16:59:38.214 20e4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Site Characteristics Database/MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/CURRENT +++ b/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/LOG index 8590d39..e6bf834 100644 --- a/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/LOG +++ b/.edge-profile-render-1774475972382/Default/Sync Data/LevelDB/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:59:37.858 3e80 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Sync Data\LevelDB since it was missing. -2026/03/25-16:59:38.118 3e80 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Sync Data\LevelDB/MANIFEST-000001 +2026/03/25-16:59:37.858 3e80 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Sync Data\LevelDB since it was missing. +2026/03/25-16:59:38.118 3e80 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\Sync Data\LevelDB/MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774475972382/Default/shared_proto_db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475972382/Default/shared_proto_db/CURRENT +++ b/.edge-profile-render-1774475972382/Default/shared_proto_db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/LOG b/.edge-profile-render-1774475972382/Default/shared_proto_db/LOG index c6e3c0e..1d13c7a 100644 --- a/.edge-profile-render-1774475972382/Default/shared_proto_db/LOG +++ b/.edge-profile-render-1774475972382/Default/shared_proto_db/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:59:40.170 3e80 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\shared_proto_db since it was missing. -2026/03/25-16:59:40.258 3e80 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\shared_proto_db/MANIFEST-000001 +2026/03/25-16:59:40.170 3e80 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\shared_proto_db since it was missing. +2026/03/25-16:59:40.258 3e80 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\shared_proto_db/MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/CURRENT +++ b/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/LOG index 3a6368a..4ec6be8 100644 --- a/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/LOG +++ b/.edge-profile-render-1774475972382/Default/shared_proto_db/metadata/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:59:40.096 52c8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\shared_proto_db\metadata since it was missing. -2026/03/25-16:59:40.131 52c8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\shared_proto_db\metadata/MANIFEST-000001 +2026/03/25-16:59:40.096 52c8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\shared_proto_db\metadata since it was missing. +2026/03/25-16:59:40.131 52c8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774475972382\Default\shared_proto_db\metadata/MANIFEST-000001 diff --git a/.edge-profile-render-1774476044634/Crashpad/throttle_store.dat b/.edge-profile-render-1774476044634/Crashpad/throttle_store.dat index 9639e1b..53a4e73 100644 --- a/.edge-profile-render-1774476044634/Crashpad/throttle_store.dat +++ b/.edge-profile-render-1774476044634/Crashpad/throttle_store.dat @@ -1 +1 @@ -level=none expiry=0 +level=none expiry=0 diff --git a/.edge-profile-render-1774484525680/Crashpad/throttle_store.dat b/.edge-profile-render-1774484525680/Crashpad/throttle_store.dat index 9639e1b..53a4e73 100644 --- a/.edge-profile-render-1774484525680/Crashpad/throttle_store.dat +++ b/.edge-profile-render-1774484525680/Crashpad/throttle_store.dat @@ -1 +1 @@ -level=none expiry=0 +level=none expiry=0 diff --git a/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/CURRENT b/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/CURRENT +++ b/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/LOG b/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/LOG index a7d35ed..01e12d1 100644 --- a/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/LOG +++ b/.edge-profile-render-1774484525680/Default/Asset Store/assets.db/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:12.180 58b0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Asset Store\assets.db since it was missing. -2026/03/25-19:22:12.804 58b0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Asset Store\assets.db/MANIFEST-000001 +2026/03/25-19:22:12.180 58b0 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Asset Store\assets.db since it was missing. +2026/03/25-19:22:12.804 58b0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Asset Store\assets.db/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/CURRENT b/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/CURRENT +++ b/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/LOG b/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/LOG index a9be593..ec5aea4 100644 --- a/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/LOG +++ b/.edge-profile-render-1774484525680/Default/EdgeCoupons/coupons_data.db/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:12.979 1b3c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\EdgeCoupons/coupons_data.db since it was missing. -2026/03/25-19:22:13.062 1b3c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\EdgeCoupons/coupons_data.db/MANIFEST-000001 +2026/03/25-19:22:12.979 1b3c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\EdgeCoupons/coupons_data.db since it was missing. +2026/03/25-19:22:13.062 1b3c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\EdgeCoupons/coupons_data.db/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/CURRENT b/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/CURRENT +++ b/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/LOG b/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/LOG index 6d7c685..55e627a 100644 --- a/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/LOG +++ b/.edge-profile-render-1774484525680/Default/EntityExtraction/EntityExtractionAssetStore.db/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:12.208 2128 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\EntityExtractionAssetStore.db since it was missing. -2026/03/25-19:22:12.663 2128 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\EntityExtractionAssetStore.db/MANIFEST-000001 +2026/03/25-19:22:12.208 2128 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\EntityExtractionAssetStore.db since it was missing. +2026/03/25-19:22:12.663 2128 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\EntityExtractionAssetStore.db/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Extension Rules/CURRENT b/.edge-profile-render-1774484525680/Default/Extension Rules/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/Extension Rules/CURRENT +++ b/.edge-profile-render-1774484525680/Default/Extension Rules/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Extension Rules/LOG b/.edge-profile-render-1774484525680/Default/Extension Rules/LOG index ab09763..129e627 100644 --- a/.edge-profile-render-1774484525680/Default/Extension Rules/LOG +++ b/.edge-profile-render-1774484525680/Default/Extension Rules/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:06.497 3acc Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension Rules since it was missing. -2026/03/25-19:22:06.507 3acc Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension Rules/MANIFEST-000001 +2026/03/25-19:22:06.497 3acc Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension Rules since it was missing. +2026/03/25-19:22:06.507 3acc Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension Rules/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Extension Scripts/CURRENT b/.edge-profile-render-1774484525680/Default/Extension Scripts/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/Extension Scripts/CURRENT +++ b/.edge-profile-render-1774484525680/Default/Extension Scripts/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Extension Scripts/LOG b/.edge-profile-render-1774484525680/Default/Extension Scripts/LOG index 8e471ea..6ef1ee0 100644 --- a/.edge-profile-render-1774484525680/Default/Extension Scripts/LOG +++ b/.edge-profile-render-1774484525680/Default/Extension Scripts/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:06.524 3acc Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension Scripts since it was missing. -2026/03/25-19:22:06.537 3acc Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension Scripts/MANIFEST-000001 +2026/03/25-19:22:06.524 3acc Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension Scripts since it was missing. +2026/03/25-19:22:06.537 3acc Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension Scripts/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Extension State/CURRENT b/.edge-profile-render-1774484525680/Default/Extension State/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/Extension State/CURRENT +++ b/.edge-profile-render-1774484525680/Default/Extension State/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Extension State/LOG b/.edge-profile-render-1774484525680/Default/Extension State/LOG index bf0d3f8..a409600 100644 --- a/.edge-profile-render-1774484525680/Default/Extension State/LOG +++ b/.edge-profile-render-1774484525680/Default/Extension State/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:07.175 4f88 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension State since it was missing. -2026/03/25-19:22:07.182 4f88 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension State/MANIFEST-000001 +2026/03/25-19:22:07.175 4f88 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension State since it was missing. +2026/03/25-19:22:07.182 4f88 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Extension State/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/as/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/as/messages.json index d3d0ca7..fd45f23 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/as/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/as/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u09a8\u09a4\u09c1\u09a8 \u09b8\u09c3\u09b7\u09cd\u099f\u09bf \u0995\u09f0\u0995"},"explanationofflinedisabled":{"message":"\u0986\u09aa\u09c1\u09a8\u09bf \u0985\u09ab\u09b2\u09be\u0987\u09a8 \u09b9\u09c8 \u0986\u099b\u09c7\u0964 \u0987\u09a3\u09cd\u099f\u09be\u09f0\u09a8\u09c7\u099f \u09b8\u0982\u09af\u09cb\u0997\u09f0 \u0985\u09ac\u09bf\u09b9\u09a8\u09c7 Google Docs \u09ac\u09cd\u09af\u09f1\u09b9\u09be\u09f0 \u0995\u09f0\u09bf\u09ac\u09b2\u09c8, Google Docs\u09f0 \u0997\u09c3\u09b9 \u09aa\u09c3\u09b7\u09cd\u09a0\u09be\u09a4 \u09a5\u0995\u09be \u099b\u09c7\u099f\u09bf\u0999\u09b2\u09c8 \u09af\u09be\u0993\u0995 \u0986\u09f0\u09c1 \u0986\u09aa\u09c1\u09a8\u09bf \u09aa\u09c1\u09a8\u09f0 \u0987\u09a3\u09cd\u099f\u09be\u09f0\u09a8\u09c7\u099f\u09f0 \u09b8\u09c8\u09a4\u09c7 \u09b8\u0982\u09af\u09c1\u0995\u09cd\u09a4 \u09b9\u2019\u09b2\u09c7 \u0985\u09ab\u09b2\u09be\u0987\u09a8\u09a4 \u099b\u09bf\u0982\u0995 \u0995\u09f0\u09be\u09f0 \u09b8\u09c1\u09ac\u09bf\u09a7\u09be\u099f\u09cb \u0985\u09a8 \u0995\u09f0\u0995\u0964"},"explanationofflineenabled":{"message":"\u0986\u09aa\u09c1\u09a8\u09bf \u0985\u09ab\u09b2\u09be\u0987\u09a8, \u0995\u09bf\u09a8\u09cd\u09a4\u09c1 \u0986\u09aa\u09c1\u09a8\u09bf \u09a4\u09a5\u09be\u09aa\u09bf \u0989\u09aa\u09b2\u09ac\u09cd\u09a7 \u09ab\u09be\u0987\u09b2\u09b8\u09ae\u09c2\u09b9 \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09f0\u09bf\u09ac \u09aa\u09be\u09f0\u09c7 \u09ac\u09be \u09a8\u09a4\u09c1\u09a8 \u09b8\u09c3\u09b7\u09cd\u099f\u09bf \u0995\u09f0\u09bf\u09ac \u09aa\u09be\u09f0\u09c7\u0964"},"extdesc":{"message":"\u0986\u09aa\u09cb\u09a8\u09be\u09f0 \u09a8\u09a5\u09bf, \u09b8\u09cd\u09aa\u09cd\u09f0\u09c7\u09a1\u09b6\u09cd\u09ac\u09c0\u099f \u0986\u09f0\u09c1 \u0989\u09aa\u09b8\u09cd\u09a5\u09be\u09aa\u09a8\u0995 \u09b8\u0995\u09b2\u09cb\u09ac\u09cb\u09f0 \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be, \u09b8\u09c3\u09b7\u09cd\u099f\u09bf \u0986\u09f0\u09c1 \u09a6\u09f0\u09cd\u09b6\u09a8 \u0995\u09f0\u0995 - \u0987\u09a3\u09cd\u099f\u09be\u09f0\u09a8\u09c7\u099f \u098f\u0995\u09cd\u09b8\u09c7\u099b\u09f0 \u0985\u09ac\u09bf\u09b9\u09a8\u09c7\u0987\u0964"},"extname":{"message":"Google Docs Offline"},"learnmore":{"message":"\u0985\u09a7\u09bf\u0995 \u099c\u09be\u09a8\u0995"},"popuphelptext":{"message":"\u0987\u09a3\u09cd\u099f\u09be\u09f0\u09a8\u09c7\u099f \u09b8\u0982\u09af\u09cb\u0997 \u09a5\u09be\u0995\u09bf\u09b2\u09c7\u0993 \u09ac\u09be \u09a8\u09be\u09a5\u09be\u0995\u09bf\u09b2\u09c7\u0993, \u0986\u09aa\u09c1\u09a8\u09bf \u09af\u2019\u09a4\u09c7\u0987 \u09a8\u09be\u09a5\u09be\u0995\u0995 \u0995\u09bf\u09df \u09a4\u09be\u09f0\u09aa\u09f0\u09be\u0987 \u09b8\u09c3\u09b7\u09cd\u099f\u09bf, \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0986\u09f0\u09c1 \u09b8\u09b9\u09af\u09cb\u0997\u09bf\u09a4\u09be \u0995\u09f0\u0995\u0964"}} +{"createnew":{"message":"\u09a8\u09a4\u09c1\u09a8 \u09b8\u09c3\u09b7\u09cd\u099f\u09bf \u0995\u09f0\u0995"},"explanationofflinedisabled":{"message":"\u0986\u09aa\u09c1\u09a8\u09bf \u0985\u09ab\u09b2\u09be\u0987\u09a8 \u09b9\u09c8 \u0986\u099b\u09c7\u0964 \u0987\u09a3\u09cd\u099f\u09be\u09f0\u09a8\u09c7\u099f \u09b8\u0982\u09af\u09cb\u0997\u09f0 \u0985\u09ac\u09bf\u09b9\u09a8\u09c7 Google Docs \u09ac\u09cd\u09af\u09f1\u09b9\u09be\u09f0 \u0995\u09f0\u09bf\u09ac\u09b2\u09c8, Google Docs\u09f0 \u0997\u09c3\u09b9 \u09aa\u09c3\u09b7\u09cd\u09a0\u09be\u09a4 \u09a5\u0995\u09be \u099b\u09c7\u099f\u09bf\u0999\u09b2\u09c8 \u09af\u09be\u0993\u0995 \u0986\u09f0\u09c1 \u0986\u09aa\u09c1\u09a8\u09bf \u09aa\u09c1\u09a8\u09f0 \u0987\u09a3\u09cd\u099f\u09be\u09f0\u09a8\u09c7\u099f\u09f0 \u09b8\u09c8\u09a4\u09c7 \u09b8\u0982\u09af\u09c1\u0995\u09cd\u09a4 \u09b9\u2019\u09b2\u09c7 \u0985\u09ab\u09b2\u09be\u0987\u09a8\u09a4 \u099b\u09bf\u0982\u0995 \u0995\u09f0\u09be\u09f0 \u09b8\u09c1\u09ac\u09bf\u09a7\u09be\u099f\u09cb \u0985\u09a8 \u0995\u09f0\u0995\u0964"},"explanationofflineenabled":{"message":"\u0986\u09aa\u09c1\u09a8\u09bf \u0985\u09ab\u09b2\u09be\u0987\u09a8, \u0995\u09bf\u09a8\u09cd\u09a4\u09c1 \u0986\u09aa\u09c1\u09a8\u09bf \u09a4\u09a5\u09be\u09aa\u09bf \u0989\u09aa\u09b2\u09ac\u09cd\u09a7 \u09ab\u09be\u0987\u09b2\u09b8\u09ae\u09c2\u09b9 \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09f0\u09bf\u09ac \u09aa\u09be\u09f0\u09c7 \u09ac\u09be \u09a8\u09a4\u09c1\u09a8 \u09b8\u09c3\u09b7\u09cd\u099f\u09bf \u0995\u09f0\u09bf\u09ac \u09aa\u09be\u09f0\u09c7\u0964"},"extdesc":{"message":"\u0986\u09aa\u09cb\u09a8\u09be\u09f0 \u09a8\u09a5\u09bf, \u09b8\u09cd\u09aa\u09cd\u09f0\u09c7\u09a1\u09b6\u09cd\u09ac\u09c0\u099f \u0986\u09f0\u09c1 \u0989\u09aa\u09b8\u09cd\u09a5\u09be\u09aa\u09a8\u0995 \u09b8\u0995\u09b2\u09cb\u09ac\u09cb\u09f0 \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be, \u09b8\u09c3\u09b7\u09cd\u099f\u09bf \u0986\u09f0\u09c1 \u09a6\u09f0\u09cd\u09b6\u09a8 \u0995\u09f0\u0995 - \u0987\u09a3\u09cd\u099f\u09be\u09f0\u09a8\u09c7\u099f \u098f\u0995\u09cd\u09b8\u09c7\u099b\u09f0 \u0985\u09ac\u09bf\u09b9\u09a8\u09c7\u0987\u0964"},"extname":{"message":"Google Docs Offline"},"learnmore":{"message":"\u0985\u09a7\u09bf\u0995 \u099c\u09be\u09a8\u0995"},"popuphelptext":{"message":"\u0987\u09a3\u09cd\u099f\u09be\u09f0\u09a8\u09c7\u099f \u09b8\u0982\u09af\u09cb\u0997 \u09a5\u09be\u0995\u09bf\u09b2\u09c7\u0993 \u09ac\u09be \u09a8\u09be\u09a5\u09be\u0995\u09bf\u09b2\u09c7\u0993, \u0986\u09aa\u09c1\u09a8\u09bf \u09af\u2019\u09a4\u09c7\u0987 \u09a8\u09be\u09a5\u09be\u0995\u0995 \u0995\u09bf\u09df \u09a4\u09be\u09f0\u09aa\u09f0\u09be\u0987 \u09b8\u09c3\u09b7\u09cd\u099f\u09bf, \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0986\u09f0\u09c1 \u09b8\u09b9\u09af\u09cb\u0997\u09bf\u09a4\u09be \u0995\u09f0\u0995\u0964"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/be/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/be/messages.json index 2af08fe..e9525a2 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/be/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/be/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u0421\u0422\u0412\u0410\u0420\u042b\u0426\u042c \u041d\u041e\u0412\u042b"},"explanationofflinedisabled":{"message":"\u0412\u044b \u045e \u043f\u0430\u0437\u0430\u0441\u0435\u0442\u043a\u0430\u0432\u044b\u043c \u0440\u044d\u0436\u044b\u043c\u0435. \u041a\u0430\u0431 \u043a\u0430\u0440\u044b\u0441\u0442\u0430\u0446\u0446\u0430 \u0414\u0430\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0456 Google \u0431\u0435\u0437 \u043f\u0430\u0434\u043a\u043b\u044e\u0447\u044d\u043d\u043d\u044f \u0434\u0430 \u0456\u043d\u0442\u044d\u0440\u043d\u044d\u0442\u0443, \u043f\u0435\u0440\u0430\u0439\u0434\u0437\u0456\u0446\u0435 \u0434\u0430 \u043d\u0430\u043b\u0430\u0434 \u043d\u0430 \u0433\u0430\u043b\u043e\u045e\u043d\u0430\u0439 \u0441\u0442\u0430\u0440\u043e\u043d\u0446\u044b \u0414\u0430\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u045e Google \u0456 \u045e\u043a\u043b\u044e\u0447\u044b\u0446\u0435 \u0441\u0456\u043d\u0445\u0440\u0430\u043d\u0456\u0437\u0430\u0446\u044b\u044e \u043f\u0430\u0434\u0447\u0430\u0441 \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0430\u0433\u0430 \u043f\u0430\u0434\u043a\u043b\u044e\u0447\u044d\u043d\u043d\u044f \u0434\u0430 \u0456\u043d\u0442\u044d\u0440\u043d\u044d\u0442\u0443."},"explanationofflineenabled":{"message":"\u0412\u044b \u045e \u043f\u0430\u0437\u0430\u0441\u0435\u0442\u043a\u0430\u0432\u044b\u043c \u0440\u044d\u0436\u044b\u043c\u0435, \u0430\u043b\u0435 \u0432\u044b \u045e\u0441\u0451 \u0440\u043e\u045e\u043d\u0430 \u043c\u043e\u0436\u0430\u0446\u0435 \u0440\u044d\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044c \u0434\u0430\u0441\u0442\u0443\u043f\u043d\u044b\u044f \u0444\u0430\u0439\u043b\u044b \u0456 \u0441\u0442\u0432\u0430\u0440\u0430\u0446\u044c \u043d\u043e\u0432\u044b\u044f."},"extdesc":{"message":"\u0420\u044d\u0434\u0430\u0433\u0430\u0432\u0430\u043d\u043d\u0435, \u0441\u0442\u0432\u0430\u0440\u044d\u043d\u043d\u0435 \u0456 \u043f\u0440\u0430\u0433\u043b\u044f\u0434 \u0434\u0430\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u045e, \u0442\u0430\u0431\u043b\u0456\u0446 \u0456 \u043f\u0440\u044d\u0437\u0435\u043d\u0442\u0430\u0446\u044b\u0439 \u0431\u0435\u0437 \u043f\u0430\u0434\u043a\u043b\u044e\u0447\u044d\u043d\u043d\u044f \u0434\u0430 \u0456\u043d\u0442\u044d\u0440\u043d\u044d\u0442\u0443."},"extname":{"message":"\u0414\u0430\u043a\u0443\u043c\u0435\u043d\u0442\u044b Google \u0443 \u043f\u0430\u0437\u0430\u0441\u0435\u0442\u043a\u0430\u0432\u044b\u043c \u0440\u044d\u0436\u044b\u043c\u0435"},"learnmore":{"message":"\u0414\u0430\u0432\u0435\u0434\u0430\u0446\u0446\u0430 \u0431\u043e\u043b\u044c\u0448"},"popuphelptext":{"message":"\u041f\u0456\u0448\u044b\u0446\u0435, \u0440\u044d\u0434\u0430\u0433\u0443\u0439\u0446\u0435 \u0456 \u0441\u0443\u043c\u0435\u0441\u043d\u0430 \u043f\u0440\u0430\u0446\u0443\u0439\u0446\u0435 \u043d\u0430\u0434 \u0434\u0430\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0456 \u0437 \u043f\u0430\u0434\u043a\u043b\u044e\u0447\u044d\u043d\u043d\u0435\u043c \u0434\u0430 \u0456\u043d\u0442\u044d\u0440\u043d\u044d\u0442\u0443 \u0456 \u0431\u0435\u0437 \u044f\u0433\u043e."}} +{"createnew":{"message":"\u0421\u0422\u0412\u0410\u0420\u042b\u0426\u042c \u041d\u041e\u0412\u042b"},"explanationofflinedisabled":{"message":"\u0412\u044b \u045e \u043f\u0430\u0437\u0430\u0441\u0435\u0442\u043a\u0430\u0432\u044b\u043c \u0440\u044d\u0436\u044b\u043c\u0435. \u041a\u0430\u0431 \u043a\u0430\u0440\u044b\u0441\u0442\u0430\u0446\u0446\u0430 \u0414\u0430\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0456 Google \u0431\u0435\u0437 \u043f\u0430\u0434\u043a\u043b\u044e\u0447\u044d\u043d\u043d\u044f \u0434\u0430 \u0456\u043d\u0442\u044d\u0440\u043d\u044d\u0442\u0443, \u043f\u0435\u0440\u0430\u0439\u0434\u0437\u0456\u0446\u0435 \u0434\u0430 \u043d\u0430\u043b\u0430\u0434 \u043d\u0430 \u0433\u0430\u043b\u043e\u045e\u043d\u0430\u0439 \u0441\u0442\u0430\u0440\u043e\u043d\u0446\u044b \u0414\u0430\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u045e Google \u0456 \u045e\u043a\u043b\u044e\u0447\u044b\u0446\u0435 \u0441\u0456\u043d\u0445\u0440\u0430\u043d\u0456\u0437\u0430\u0446\u044b\u044e \u043f\u0430\u0434\u0447\u0430\u0441 \u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0430\u0433\u0430 \u043f\u0430\u0434\u043a\u043b\u044e\u0447\u044d\u043d\u043d\u044f \u0434\u0430 \u0456\u043d\u0442\u044d\u0440\u043d\u044d\u0442\u0443."},"explanationofflineenabled":{"message":"\u0412\u044b \u045e \u043f\u0430\u0437\u0430\u0441\u0435\u0442\u043a\u0430\u0432\u044b\u043c \u0440\u044d\u0436\u044b\u043c\u0435, \u0430\u043b\u0435 \u0432\u044b \u045e\u0441\u0451 \u0440\u043e\u045e\u043d\u0430 \u043c\u043e\u0436\u0430\u0446\u0435 \u0440\u044d\u0434\u0430\u0433\u0430\u0432\u0430\u0446\u044c \u0434\u0430\u0441\u0442\u0443\u043f\u043d\u044b\u044f \u0444\u0430\u0439\u043b\u044b \u0456 \u0441\u0442\u0432\u0430\u0440\u0430\u0446\u044c \u043d\u043e\u0432\u044b\u044f."},"extdesc":{"message":"\u0420\u044d\u0434\u0430\u0433\u0430\u0432\u0430\u043d\u043d\u0435, \u0441\u0442\u0432\u0430\u0440\u044d\u043d\u043d\u0435 \u0456 \u043f\u0440\u0430\u0433\u043b\u044f\u0434 \u0434\u0430\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u045e, \u0442\u0430\u0431\u043b\u0456\u0446 \u0456 \u043f\u0440\u044d\u0437\u0435\u043d\u0442\u0430\u0446\u044b\u0439 \u0431\u0435\u0437 \u043f\u0430\u0434\u043a\u043b\u044e\u0447\u044d\u043d\u043d\u044f \u0434\u0430 \u0456\u043d\u0442\u044d\u0440\u043d\u044d\u0442\u0443."},"extname":{"message":"\u0414\u0430\u043a\u0443\u043c\u0435\u043d\u0442\u044b Google \u0443 \u043f\u0430\u0437\u0430\u0441\u0435\u0442\u043a\u0430\u0432\u044b\u043c \u0440\u044d\u0436\u044b\u043c\u0435"},"learnmore":{"message":"\u0414\u0430\u0432\u0435\u0434\u0430\u0446\u0446\u0430 \u0431\u043e\u043b\u044c\u0448"},"popuphelptext":{"message":"\u041f\u0456\u0448\u044b\u0446\u0435, \u0440\u044d\u0434\u0430\u0433\u0443\u0439\u0446\u0435 \u0456 \u0441\u0443\u043c\u0435\u0441\u043d\u0430 \u043f\u0440\u0430\u0446\u0443\u0439\u0446\u0435 \u043d\u0430\u0434 \u0434\u0430\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0456 \u0437 \u043f\u0430\u0434\u043a\u043b\u044e\u0447\u044d\u043d\u043d\u0435\u043c \u0434\u0430 \u0456\u043d\u0442\u044d\u0440\u043d\u044d\u0442\u0443 \u0456 \u0431\u0435\u0437 \u044f\u0433\u043e."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/cy/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/cy/messages.json index 50c0c02..a2da617 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/cy/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/cy/messages.json @@ -1 +1 @@ -{"createnew":{"message":"CREU NEWYDD"},"explanationofflinedisabled":{"message":"Rydych chi all-lein. I ddefnyddio Dogfennau Google heb gysylltiad \u00e2'r rhyngrwyd, ewch i'r gosodiadau ar dudalen hafan Dogfennau Google a throi 'offine sync' ymlaen y tro nesaf y byddwch wedi'ch cysylltu \u00e2'r rhyngrwyd."},"explanationofflineenabled":{"message":"Rydych chi all-lein, ond gallwch barhau i olygu'r ffeiliau sydd ar gael neu greu rhai newydd."},"extdesc":{"message":"Gallwch olygu, creu a gweld eich dogfennau, taenlenni a chyflwyniadau \u2013 i gyd heb fynediad i'r rhyngrwyd."},"extname":{"message":"Dogfennau Google All-lein"},"learnmore":{"message":"DYSGU MWY"},"popuphelptext":{"message":"Ysgrifennwch, golygwch a chydweithiwch lle bynnag yr ydych, gyda chysylltiad \u00e2'r rhyngrwyd neu hebddo."}} +{"createnew":{"message":"CREU NEWYDD"},"explanationofflinedisabled":{"message":"Rydych chi all-lein. I ddefnyddio Dogfennau Google heb gysylltiad \u00e2'r rhyngrwyd, ewch i'r gosodiadau ar dudalen hafan Dogfennau Google a throi 'offine sync' ymlaen y tro nesaf y byddwch wedi'ch cysylltu \u00e2'r rhyngrwyd."},"explanationofflineenabled":{"message":"Rydych chi all-lein, ond gallwch barhau i olygu'r ffeiliau sydd ar gael neu greu rhai newydd."},"extdesc":{"message":"Gallwch olygu, creu a gweld eich dogfennau, taenlenni a chyflwyniadau \u2013 i gyd heb fynediad i'r rhyngrwyd."},"extname":{"message":"Dogfennau Google All-lein"},"learnmore":{"message":"DYSGU MWY"},"popuphelptext":{"message":"Ysgrifennwch, golygwch a chydweithiwch lle bynnag yr ydych, gyda chysylltiad \u00e2'r rhyngrwyd neu hebddo."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/eu/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/eu/messages.json index b152542..ca7732c 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/eu/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/eu/messages.json @@ -1 +1 @@ -{"createnew":{"message":"SORTU"},"explanationofflinedisabled":{"message":"Ez zaude konektatuta Internetera. Google Dokumentuak konexiorik gabe erabiltzeko, joan Google Dokumentuak zerbitzuaren orri nagusiko ezarpenetara eta aktibatu konexiorik gabeko sinkronizazioa Internetera konektatzen zaren hurrengoan."},"explanationofflineenabled":{"message":"Ez zaude konektatuta Internetera, baina erabilgarri dauden fitxategiak edita ditzakezu, baita beste batzuk sortu ere."},"extdesc":{"message":"Editatu, sortu eta ikusi dokumentuak, kalkulu-orriak eta aurkezpenak Interneteko konexiorik gabe."},"extname":{"message":"Google Dokumentuak konexiorik gabe"},"learnmore":{"message":"Lortu informazio gehiago"},"popuphelptext":{"message":"Edonon zaudela ere, ez duzu zertan konektatuta egon idatzi, editatu eta lankidetzan jardun ahal izateko."}} +{"createnew":{"message":"SORTU"},"explanationofflinedisabled":{"message":"Ez zaude konektatuta Internetera. Google Dokumentuak konexiorik gabe erabiltzeko, joan Google Dokumentuak zerbitzuaren orri nagusiko ezarpenetara eta aktibatu konexiorik gabeko sinkronizazioa Internetera konektatzen zaren hurrengoan."},"explanationofflineenabled":{"message":"Ez zaude konektatuta Internetera, baina erabilgarri dauden fitxategiak edita ditzakezu, baita beste batzuk sortu ere."},"extdesc":{"message":"Editatu, sortu eta ikusi dokumentuak, kalkulu-orriak eta aurkezpenak Interneteko konexiorik gabe."},"extname":{"message":"Google Dokumentuak konexiorik gabe"},"learnmore":{"message":"Lortu informazio gehiago"},"popuphelptext":{"message":"Edonon zaudela ere, ez duzu zertan konektatuta egon idatzi, editatu eta lankidetzan jardun ahal izateko."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hy/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hy/messages.json index ef19f42..8366385 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hy/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/hy/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u054d\u054f\u0535\u0542\u053e\u0535\u053c \u0546\u0548\u0550"},"explanationofflinedisabled":{"message":"Google \u0553\u0561\u057d\u057f\u0561\u0569\u0572\u0569\u0565\u0580\u0568 \u0576\u0561\u0587 \u0561\u0576\u0581\u0561\u0576\u0581 \u057c\u0565\u056a\u056b\u0574\u0578\u0582\u0574 \u0585\u0563\u057f\u0561\u0563\u0578\u0580\u056e\u0565\u056c\u0578\u0582 \u0570\u0561\u0574\u0561\u0580 \u0574\u056b\u0561\u0581\u0565\u0584 \u0570\u0561\u0574\u0561\u0581\u0561\u0576\u0581\u056b\u0576, \u0562\u0561\u0581\u0565\u0584 \u056e\u0561\u057c\u0561\u0575\u0578\u0582\u0569\u0575\u0561\u0576 \u0563\u056c\u056d\u0561\u057e\u0578\u0580 \u0567\u057b\u0568, \u0561\u0576\u0581\u0565\u0584 \u056f\u0561\u0580\u0563\u0561\u057e\u0578\u0580\u0578\u0582\u0574\u0576\u0565\u0580 \u0587 \u0574\u056b\u0561\u0581\u0580\u0565\u0584 \u0561\u0576\u0581\u0561\u0576\u0581 \u0570\u0561\u0574\u0561\u056a\u0561\u0574\u0561\u0581\u0578\u0582\u0574\u0568:"},"explanationofflineenabled":{"message":"\u0534\u0578\u0582\u0584 \u0574\u056b\u0561\u0581\u0561\u056e \u0579\u0565\u0584 \u0570\u0561\u0574\u0561\u0581\u0561\u0576\u0581\u056b\u0576, \u057d\u0561\u056f\u0561\u0575\u0576 \u0564\u0561\u0580\u0571\u0575\u0561\u056c \u056f\u0561\u0580\u0578\u0572 \u0565\u0584 \u0583\u0578\u0583\u0578\u056d\u0565\u056c \u0561\u057c\u056f\u0561 \u0586\u0561\u0575\u056c\u0565\u0580\u0568 \u056f\u0561\u0574 \u057d\u057f\u0565\u0572\u056e\u0565\u056c \u0576\u0578\u0580 \u0583\u0561\u057d\u057f\u0561\u0569\u0572\u0569\u0565\u0580:"},"extdesc":{"message":"\u0553\u0578\u0583\u0578\u056d\u0565\u0584, \u057d\u057f\u0565\u0572\u056e\u0565\u0584 \u0587 \u0564\u056b\u057f\u0565\u0584 \u0571\u0565\u0580 \u0583\u0561\u057d\u057f\u0561\u0569\u0572\u0569\u0565\u0580\u0568, \u0561\u0572\u0575\u0578\u0582\u057d\u0561\u056f\u0576\u0565\u0580\u0576 \u0578\u0582 \u0576\u0565\u0580\u056f\u0561\u0575\u0561\u0581\u0578\u0582\u0574\u0576\u0565\u0580\u0568 \u0561\u057c\u0561\u0576\u0581 \u056b\u0576\u057f\u0565\u0580\u0576\u0565\u057f \u056f\u0561\u057a\u056b:"},"extname":{"message":"Google Docs Offline"},"learnmore":{"message":"\u0544\u0561\u0576\u0580\u0561\u0574\u0561\u057d\u0576"},"popuphelptext":{"message":"\u054d\u057f\u0565\u0572\u056e\u0565\u0584 \u0583\u0561\u057d\u057f\u0561\u0569\u0572\u0569\u0565\u0580 \u0587 \u056d\u0574\u0562\u0561\u0563\u0580\u0565\u0584 \u0564\u0580\u0561\u0576\u0584 \u0563\u0578\u0580\u056e\u0568\u0576\u056f\u0565\u0580\u0576\u0565\u0580\u056b \u0570\u0565\u057f \u0574\u056b\u0561\u057d\u056b\u0576\u055d \u0578\u0580\u057f\u0565\u0572 \u0567\u056c \u0578\u0580 \u056c\u056b\u0576\u0565\u0584, \u0561\u0576\u0563\u0561\u0574 \u0561\u057c\u0561\u0576\u0581 \u0581\u0561\u0576\u0581\u056b\u0576 \u0574\u056b\u0561\u0576\u0561\u056c\u0578\u0582\u0589"}} +{"createnew":{"message":"\u054d\u054f\u0535\u0542\u053e\u0535\u053c \u0546\u0548\u0550"},"explanationofflinedisabled":{"message":"Google \u0553\u0561\u057d\u057f\u0561\u0569\u0572\u0569\u0565\u0580\u0568 \u0576\u0561\u0587 \u0561\u0576\u0581\u0561\u0576\u0581 \u057c\u0565\u056a\u056b\u0574\u0578\u0582\u0574 \u0585\u0563\u057f\u0561\u0563\u0578\u0580\u056e\u0565\u056c\u0578\u0582 \u0570\u0561\u0574\u0561\u0580 \u0574\u056b\u0561\u0581\u0565\u0584 \u0570\u0561\u0574\u0561\u0581\u0561\u0576\u0581\u056b\u0576, \u0562\u0561\u0581\u0565\u0584 \u056e\u0561\u057c\u0561\u0575\u0578\u0582\u0569\u0575\u0561\u0576 \u0563\u056c\u056d\u0561\u057e\u0578\u0580 \u0567\u057b\u0568, \u0561\u0576\u0581\u0565\u0584 \u056f\u0561\u0580\u0563\u0561\u057e\u0578\u0580\u0578\u0582\u0574\u0576\u0565\u0580 \u0587 \u0574\u056b\u0561\u0581\u0580\u0565\u0584 \u0561\u0576\u0581\u0561\u0576\u0581 \u0570\u0561\u0574\u0561\u056a\u0561\u0574\u0561\u0581\u0578\u0582\u0574\u0568:"},"explanationofflineenabled":{"message":"\u0534\u0578\u0582\u0584 \u0574\u056b\u0561\u0581\u0561\u056e \u0579\u0565\u0584 \u0570\u0561\u0574\u0561\u0581\u0561\u0576\u0581\u056b\u0576, \u057d\u0561\u056f\u0561\u0575\u0576 \u0564\u0561\u0580\u0571\u0575\u0561\u056c \u056f\u0561\u0580\u0578\u0572 \u0565\u0584 \u0583\u0578\u0583\u0578\u056d\u0565\u056c \u0561\u057c\u056f\u0561 \u0586\u0561\u0575\u056c\u0565\u0580\u0568 \u056f\u0561\u0574 \u057d\u057f\u0565\u0572\u056e\u0565\u056c \u0576\u0578\u0580 \u0583\u0561\u057d\u057f\u0561\u0569\u0572\u0569\u0565\u0580:"},"extdesc":{"message":"\u0553\u0578\u0583\u0578\u056d\u0565\u0584, \u057d\u057f\u0565\u0572\u056e\u0565\u0584 \u0587 \u0564\u056b\u057f\u0565\u0584 \u0571\u0565\u0580 \u0583\u0561\u057d\u057f\u0561\u0569\u0572\u0569\u0565\u0580\u0568, \u0561\u0572\u0575\u0578\u0582\u057d\u0561\u056f\u0576\u0565\u0580\u0576 \u0578\u0582 \u0576\u0565\u0580\u056f\u0561\u0575\u0561\u0581\u0578\u0582\u0574\u0576\u0565\u0580\u0568 \u0561\u057c\u0561\u0576\u0581 \u056b\u0576\u057f\u0565\u0580\u0576\u0565\u057f \u056f\u0561\u057a\u056b:"},"extname":{"message":"Google Docs Offline"},"learnmore":{"message":"\u0544\u0561\u0576\u0580\u0561\u0574\u0561\u057d\u0576"},"popuphelptext":{"message":"\u054d\u057f\u0565\u0572\u056e\u0565\u0584 \u0583\u0561\u057d\u057f\u0561\u0569\u0572\u0569\u0565\u0580 \u0587 \u056d\u0574\u0562\u0561\u0563\u0580\u0565\u0584 \u0564\u0580\u0561\u0576\u0584 \u0563\u0578\u0580\u056e\u0568\u0576\u056f\u0565\u0580\u0576\u0565\u0580\u056b \u0570\u0565\u057f \u0574\u056b\u0561\u057d\u056b\u0576\u055d \u0578\u0580\u057f\u0565\u0572 \u0567\u056c \u0578\u0580 \u056c\u056b\u0576\u0565\u0584, \u0561\u0576\u0563\u0561\u0574 \u0561\u057c\u0561\u0576\u0581 \u0581\u0561\u0576\u0581\u056b\u0576 \u0574\u056b\u0561\u0576\u0561\u056c\u0578\u0582\u0589"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/is/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/is/messages.json index 74eed4c..359250a 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/is/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/is/messages.json @@ -1 +1 @@ -{"createnew":{"message":"B\u00daA TIL N\u00ddTT"},"explanationofflinedisabled":{"message":"\u00de\u00fa ert \u00e1n nettengingar. Til a\u00f0 nota Google-skj\u00f6l \u00e1n nettengingar skaltu opna stillingarnar \u00e1 heimas\u00ed\u00f0u Google skjala og virkja samstillingu \u00e1n nettengingar n\u00e6st \u00feegar \u00fe\u00fa tengist netinu."},"explanationofflineenabled":{"message":"Engin nettenging. \u00de\u00fa getur samt sem \u00e1\u00f0ur breytt tilt\u00e6kum skr\u00e1m e\u00f0a b\u00fai\u00f0 til n\u00fdjar."},"extdesc":{"message":"Breyttu, b\u00fa\u00f0u til og sko\u00f0a\u00f0u skj\u00f6lin \u00fe\u00edn, t\u00f6flureikna og kynningar \u2014 allt \u00e1n nettengingar."},"extname":{"message":"Google-skj\u00f6l \u00e1n nettengingar"},"learnmore":{"message":"Frekari uppl\u00fdsingar"},"popuphelptext":{"message":"Skrifa\u00f0u, breyttu og starfa\u00f0u me\u00f0 \u00f6\u00f0rum hvort sem nettenging er til sta\u00f0ar e\u00f0a ekki."}} +{"createnew":{"message":"B\u00daA TIL N\u00ddTT"},"explanationofflinedisabled":{"message":"\u00de\u00fa ert \u00e1n nettengingar. Til a\u00f0 nota Google-skj\u00f6l \u00e1n nettengingar skaltu opna stillingarnar \u00e1 heimas\u00ed\u00f0u Google skjala og virkja samstillingu \u00e1n nettengingar n\u00e6st \u00feegar \u00fe\u00fa tengist netinu."},"explanationofflineenabled":{"message":"Engin nettenging. \u00de\u00fa getur samt sem \u00e1\u00f0ur breytt tilt\u00e6kum skr\u00e1m e\u00f0a b\u00fai\u00f0 til n\u00fdjar."},"extdesc":{"message":"Breyttu, b\u00fa\u00f0u til og sko\u00f0a\u00f0u skj\u00f6lin \u00fe\u00edn, t\u00f6flureikna og kynningar \u2014 allt \u00e1n nettengingar."},"extname":{"message":"Google-skj\u00f6l \u00e1n nettengingar"},"learnmore":{"message":"Frekari uppl\u00fdsingar"},"popuphelptext":{"message":"Skrifa\u00f0u, breyttu og starfa\u00f0u me\u00f0 \u00f6\u00f0rum hvort sem nettenging er til sta\u00f0ar e\u00f0a ekki."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/iw/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/iw/messages.json index 69f051c..b646e1c 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/iw/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/iw/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u05d9\u05e6\u05d9\u05e8\u05ea \u05d7\u05d3\u05e9"},"explanationofflinedisabled":{"message":"\u05d0\u05d9\u05df \u05dc\u05da \u05d7\u05d9\u05d1\u05d5\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8. \u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1-Google Docs \u05dc\u05dc\u05d0 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8, \u05d1\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05d4\u05d1\u05d0\u05d4 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8, \u05d9\u05e9 \u05dc\u05e2\u05d1\u05d5\u05e8 \u05dc\u05e7\u05d8\u05e2 \u05d4\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d1\u05d3\u05e3 \u05d4\u05d1\u05d9\u05ea \u05e9\u05dc Google Docs \u05d5\u05dc\u05d4\u05e4\u05e2\u05d9\u05dc \u05e1\u05e0\u05db\u05e8\u05d5\u05df \u05d1\u05de\u05e6\u05d1 \u05d0\u05d5\u05e4\u05dc\u05d9\u05d9\u05df."},"explanationofflineenabled":{"message":"\u05d0\u05d9\u05df \u05dc\u05da \u05d7\u05d9\u05d1\u05d5\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8, \u05d0\u05da \u05e2\u05d3\u05d9\u05d9\u05df \u05d1\u05d0\u05e4\u05e9\u05e8\u05d5\u05ea\u05da \u05dc\u05e2\u05e8\u05d5\u05da \u05d0\u05ea \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05d4\u05d6\u05de\u05d9\u05e0\u05d9\u05dd \u05d0\u05d5 \u05dc\u05d9\u05e6\u05d5\u05e8 \u05e7\u05d1\u05e6\u05d9\u05dd \u05d7\u05d3\u05e9\u05d9\u05dd."},"extdesc":{"message":"\u05e2\u05e8\u05d9\u05db\u05d4, \u05d9\u05e6\u05d9\u05e8\u05d4 \u05d5\u05d4\u05e6\u05d2\u05d4 \u05e9\u05dc \u05de\u05e1\u05de\u05db\u05d9\u05dd, \u05d2\u05d9\u05dc\u05d9\u05d5\u05e0\u05d5\u05ea \u05d0\u05dc\u05e7\u05d8\u05e8\u05d5\u05e0\u05d9\u05d9\u05dd \u05d5\u05de\u05e6\u05d2\u05d5\u05ea \u2013 \u05d2\u05dd \u05d1\u05dc\u05d9 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8."},"extname":{"message":"Google Docs Offline"},"learnmore":{"message":"\u05de\u05d9\u05d3\u05e2 \u05e0\u05d5\u05e1\u05e3"},"popuphelptext":{"message":"\u05db\u05ea\u05d9\u05d1\u05d4, \u05e2\u05e8\u05d9\u05db\u05d4 \u05d5\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e4\u05e2\u05d5\u05dc\u05d4 \u05d1\u05db\u05dc \u05de\u05e7\u05d5\u05dd, \u05e2\u05dd \u05d0\u05d5 \u05d1\u05dc\u05d9 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8."}} +{"createnew":{"message":"\u05d9\u05e6\u05d9\u05e8\u05ea \u05d7\u05d3\u05e9"},"explanationofflinedisabled":{"message":"\u05d0\u05d9\u05df \u05dc\u05da \u05d7\u05d9\u05d1\u05d5\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8. \u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1-Google Docs \u05dc\u05dc\u05d0 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8, \u05d1\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05d4\u05d1\u05d0\u05d4 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8, \u05d9\u05e9 \u05dc\u05e2\u05d1\u05d5\u05e8 \u05dc\u05e7\u05d8\u05e2 \u05d4\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d1\u05d3\u05e3 \u05d4\u05d1\u05d9\u05ea \u05e9\u05dc Google Docs \u05d5\u05dc\u05d4\u05e4\u05e2\u05d9\u05dc \u05e1\u05e0\u05db\u05e8\u05d5\u05df \u05d1\u05de\u05e6\u05d1 \u05d0\u05d5\u05e4\u05dc\u05d9\u05d9\u05df."},"explanationofflineenabled":{"message":"\u05d0\u05d9\u05df \u05dc\u05da \u05d7\u05d9\u05d1\u05d5\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8, \u05d0\u05da \u05e2\u05d3\u05d9\u05d9\u05df \u05d1\u05d0\u05e4\u05e9\u05e8\u05d5\u05ea\u05da \u05dc\u05e2\u05e8\u05d5\u05da \u05d0\u05ea \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05d4\u05d6\u05de\u05d9\u05e0\u05d9\u05dd \u05d0\u05d5 \u05dc\u05d9\u05e6\u05d5\u05e8 \u05e7\u05d1\u05e6\u05d9\u05dd \u05d7\u05d3\u05e9\u05d9\u05dd."},"extdesc":{"message":"\u05e2\u05e8\u05d9\u05db\u05d4, \u05d9\u05e6\u05d9\u05e8\u05d4 \u05d5\u05d4\u05e6\u05d2\u05d4 \u05e9\u05dc \u05de\u05e1\u05de\u05db\u05d9\u05dd, \u05d2\u05d9\u05dc\u05d9\u05d5\u05e0\u05d5\u05ea \u05d0\u05dc\u05e7\u05d8\u05e8\u05d5\u05e0\u05d9\u05d9\u05dd \u05d5\u05de\u05e6\u05d2\u05d5\u05ea \u2013 \u05d2\u05dd \u05d1\u05dc\u05d9 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8."},"extname":{"message":"Google Docs Offline"},"learnmore":{"message":"\u05de\u05d9\u05d3\u05e2 \u05e0\u05d5\u05e1\u05e3"},"popuphelptext":{"message":"\u05db\u05ea\u05d9\u05d1\u05d4, \u05e2\u05e8\u05d9\u05db\u05d4 \u05d5\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e4\u05e2\u05d5\u05dc\u05d4 \u05d1\u05db\u05dc \u05de\u05e7\u05d5\u05dd, \u05e2\u05dd \u05d0\u05d5 \u05d1\u05dc\u05d9 \u05d7\u05d9\u05d1\u05d5\u05e8 \u05dc\u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ka/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ka/messages.json index a83cd82..526b7cd 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ka/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/ka/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u10d0\u10ee\u10da\u10d8\u10e1 \u10e8\u10d4\u10e5\u10db\u10dc\u10d0"},"explanationofflinedisabled":{"message":"\u10d7\u10e5\u10d5\u10d4\u10dc \u10ee\u10d0\u10d6\u10d2\u10d0\u10e0\u10d4\u10e8\u10d4 \u10ee\u10d0\u10e0\u10d7. Google Docs-\u10d8\u10e1 \u10d8\u10dc\u10e2\u10d4\u10e0\u10dc\u10d4\u10e2\u10d7\u10d0\u10dc \u10d9\u10d0\u10d5\u10e8\u10d8\u10e0\u10d8\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4 \u10d2\u10d0\u10db\u10dd\u10e1\u10d0\u10e7\u10d4\u10dc\u10d4\u10d1\u10da\u10d0\u10d3 \u10d2\u10d0\u10d3\u10d0\u10d3\u10d8\u10d7 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d6\u10d4 Google Docs-\u10d8\u10e1 \u10db\u10d7\u10d0\u10d5\u10d0\u10e0 \u10d2\u10d5\u10d4\u10e0\u10d3\u10d6\u10d4 \u10d3\u10d0 \u10e9\u10d0\u10e0\u10d7\u10d4\u10d7 \u10ee\u10d0\u10d6\u10d2\u10d0\u10e0\u10d4\u10e8\u10d4 \u10e1\u10d8\u10dc\u10e5\u10e0\u10dd\u10dc\u10d8\u10d6\u10d0\u10ea\u10d8\u10d0, \u10e0\u10dd\u10d3\u10d4\u10e1\u10d0\u10ea \u10e8\u10d4\u10db\u10d3\u10d2\u10dd\u10db\u10e8\u10d8 \u10d3\u10d0\u10e3\u10d9\u10d0\u10d5\u10e8\u10d8\u10e0\u10d3\u10d4\u10d1\u10d8\u10d7 \u10d8\u10dc\u10e2\u10d4\u10e0\u10dc\u10d4\u10e2\u10e1."},"explanationofflineenabled":{"message":"\u10d7\u10e5\u10d5\u10d4\u10dc \u10ee\u10d0\u10d6\u10d2\u10d0\u10e0\u10d4\u10e8\u10d4 \u10ee\u10d0\u10e0\u10d7, \u10db\u10d0\u10d2\u10e0\u10d0\u10db \u10db\u10d0\u10d8\u10dc\u10ea \u10e8\u10d4\u10d2\u10d8\u10eb\u10da\u10d8\u10d0\u10d7 \u10d3\u10d0\u10d0\u10e0\u10d4\u10d3\u10d0\u10e5\u10e2\u10d8\u10e0\u10dd\u10d7 \u10ee\u10d4\u10da\u10db\u10d8\u10e1\u10d0\u10ec\u10d5\u10d3\u10dd\u10db\u10d8 \u10e4\u10d0\u10d8\u10da\u10d4\u10d1\u10d8 \u10d0\u10dc \u10e8\u10d4\u10e5\u10db\u10dc\u10d0\u10d7 \u10d0\u10ee\u10da\u10d4\u10d1\u10d8."},"extdesc":{"message":"\u10d3\u10d0\u10d0\u10e0\u10d4\u10d3\u10d0\u10e5\u10e2\u10d8\u10e0\u10d4\u10d7, \u10e8\u10d4\u10e5\u10db\u10d4\u10dc\u10d8\u10d7 \u10d3\u10d0 \u10d3\u10d0\u10d0\u10d7\u10d5\u10d0\u10da\u10d8\u10d4\u10e0\u10d4\u10d7 \u10d7\u10e5\u10d5\u10d4\u10dc\u10d8 \u10d3\u10dd\u10d9\u10e3\u10db\u10d4\u10dc\u10e2\u10d4\u10d1\u10d8, \u10d4\u10da\u10ea\u10ee\u10e0\u10d8\u10da\u10d4\u10d1\u10d8 \u10d3\u10d0 \u10de\u10e0\u10d4\u10d6\u10d4\u10dc\u10e2\u10d0\u10ea\u10d8\u10d4\u10d1\u10d8 \u2014 \u10d4\u10e1 \u10e7\u10d5\u10d4\u10da\u10d0\u10e4\u10d4\u10e0\u10d8 \u10e8\u10d4\u10e1\u10d0\u10eb\u10da\u10d4\u10d1\u10d4\u10da\u10d8\u10d0 \u10d8\u10dc\u10e2\u10d4\u10e0\u10dc\u10d4\u10e2\u10d6\u10d4 \u10ec\u10d5\u10d3\u10dd\u10db\u10d8\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4"},"extname":{"message":"\u10ee\u10d0\u10d6\u10d2\u10d0\u10e0\u10d4\u10e8\u10d4 Google Docs"},"learnmore":{"message":"\u10e8\u10d4\u10d8\u10e2\u10e7\u10d5\u10d4\u10d7 \u10db\u10d4\u10e2\u10d8"},"popuphelptext":{"message":"\u10e9\u10d0\u10ec\u10d4\u10e0\u10d4\u10d7, \u10d3\u10d0\u10d0\u10e0\u10d4\u10d3\u10d0\u10e5\u10e2\u10d8\u10e0\u10d4\u10d7 \u10d3\u10d0 \u10db\u10dd\u10d0\u10ee\u10d3\u10d8\u10dc\u10d4\u10d7 \u10d9\u10dd\u10da\u10d0\u10d1\u10dd\u10e0\u10d0\u10ea\u10d8\u10d0 \u10e1\u10d0\u10d3\u10d0\u10ea \u10e3\u10dc\u10d3\u10d0 \u10d8\u10e7\u10dd\u10d7, \u10d8\u10dc\u10e2\u10d4\u10e0\u10dc\u10d4\u10e2\u10d7\u10d0\u10dc \u10d9\u10d0\u10d5\u10e8\u10d8\u10e0\u10d8\u10d7 \u10d0\u10dc \u10db\u10d8\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4."}} +{"createnew":{"message":"\u10d0\u10ee\u10da\u10d8\u10e1 \u10e8\u10d4\u10e5\u10db\u10dc\u10d0"},"explanationofflinedisabled":{"message":"\u10d7\u10e5\u10d5\u10d4\u10dc \u10ee\u10d0\u10d6\u10d2\u10d0\u10e0\u10d4\u10e8\u10d4 \u10ee\u10d0\u10e0\u10d7. Google Docs-\u10d8\u10e1 \u10d8\u10dc\u10e2\u10d4\u10e0\u10dc\u10d4\u10e2\u10d7\u10d0\u10dc \u10d9\u10d0\u10d5\u10e8\u10d8\u10e0\u10d8\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4 \u10d2\u10d0\u10db\u10dd\u10e1\u10d0\u10e7\u10d4\u10dc\u10d4\u10d1\u10da\u10d0\u10d3 \u10d2\u10d0\u10d3\u10d0\u10d3\u10d8\u10d7 \u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d6\u10d4 Google Docs-\u10d8\u10e1 \u10db\u10d7\u10d0\u10d5\u10d0\u10e0 \u10d2\u10d5\u10d4\u10e0\u10d3\u10d6\u10d4 \u10d3\u10d0 \u10e9\u10d0\u10e0\u10d7\u10d4\u10d7 \u10ee\u10d0\u10d6\u10d2\u10d0\u10e0\u10d4\u10e8\u10d4 \u10e1\u10d8\u10dc\u10e5\u10e0\u10dd\u10dc\u10d8\u10d6\u10d0\u10ea\u10d8\u10d0, \u10e0\u10dd\u10d3\u10d4\u10e1\u10d0\u10ea \u10e8\u10d4\u10db\u10d3\u10d2\u10dd\u10db\u10e8\u10d8 \u10d3\u10d0\u10e3\u10d9\u10d0\u10d5\u10e8\u10d8\u10e0\u10d3\u10d4\u10d1\u10d8\u10d7 \u10d8\u10dc\u10e2\u10d4\u10e0\u10dc\u10d4\u10e2\u10e1."},"explanationofflineenabled":{"message":"\u10d7\u10e5\u10d5\u10d4\u10dc \u10ee\u10d0\u10d6\u10d2\u10d0\u10e0\u10d4\u10e8\u10d4 \u10ee\u10d0\u10e0\u10d7, \u10db\u10d0\u10d2\u10e0\u10d0\u10db \u10db\u10d0\u10d8\u10dc\u10ea \u10e8\u10d4\u10d2\u10d8\u10eb\u10da\u10d8\u10d0\u10d7 \u10d3\u10d0\u10d0\u10e0\u10d4\u10d3\u10d0\u10e5\u10e2\u10d8\u10e0\u10dd\u10d7 \u10ee\u10d4\u10da\u10db\u10d8\u10e1\u10d0\u10ec\u10d5\u10d3\u10dd\u10db\u10d8 \u10e4\u10d0\u10d8\u10da\u10d4\u10d1\u10d8 \u10d0\u10dc \u10e8\u10d4\u10e5\u10db\u10dc\u10d0\u10d7 \u10d0\u10ee\u10da\u10d4\u10d1\u10d8."},"extdesc":{"message":"\u10d3\u10d0\u10d0\u10e0\u10d4\u10d3\u10d0\u10e5\u10e2\u10d8\u10e0\u10d4\u10d7, \u10e8\u10d4\u10e5\u10db\u10d4\u10dc\u10d8\u10d7 \u10d3\u10d0 \u10d3\u10d0\u10d0\u10d7\u10d5\u10d0\u10da\u10d8\u10d4\u10e0\u10d4\u10d7 \u10d7\u10e5\u10d5\u10d4\u10dc\u10d8 \u10d3\u10dd\u10d9\u10e3\u10db\u10d4\u10dc\u10e2\u10d4\u10d1\u10d8, \u10d4\u10da\u10ea\u10ee\u10e0\u10d8\u10da\u10d4\u10d1\u10d8 \u10d3\u10d0 \u10de\u10e0\u10d4\u10d6\u10d4\u10dc\u10e2\u10d0\u10ea\u10d8\u10d4\u10d1\u10d8 \u2014 \u10d4\u10e1 \u10e7\u10d5\u10d4\u10da\u10d0\u10e4\u10d4\u10e0\u10d8 \u10e8\u10d4\u10e1\u10d0\u10eb\u10da\u10d4\u10d1\u10d4\u10da\u10d8\u10d0 \u10d8\u10dc\u10e2\u10d4\u10e0\u10dc\u10d4\u10e2\u10d6\u10d4 \u10ec\u10d5\u10d3\u10dd\u10db\u10d8\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4"},"extname":{"message":"\u10ee\u10d0\u10d6\u10d2\u10d0\u10e0\u10d4\u10e8\u10d4 Google Docs"},"learnmore":{"message":"\u10e8\u10d4\u10d8\u10e2\u10e7\u10d5\u10d4\u10d7 \u10db\u10d4\u10e2\u10d8"},"popuphelptext":{"message":"\u10e9\u10d0\u10ec\u10d4\u10e0\u10d4\u10d7, \u10d3\u10d0\u10d0\u10e0\u10d4\u10d3\u10d0\u10e5\u10e2\u10d8\u10e0\u10d4\u10d7 \u10d3\u10d0 \u10db\u10dd\u10d0\u10ee\u10d3\u10d8\u10dc\u10d4\u10d7 \u10d9\u10dd\u10da\u10d0\u10d1\u10dd\u10e0\u10d0\u10ea\u10d8\u10d0 \u10e1\u10d0\u10d3\u10d0\u10ea \u10e3\u10dc\u10d3\u10d0 \u10d8\u10e7\u10dd\u10d7, \u10d8\u10dc\u10e2\u10d4\u10e0\u10dc\u10d4\u10e2\u10d7\u10d0\u10dc \u10d9\u10d0\u10d5\u10e8\u10d8\u10e0\u10d8\u10d7 \u10d0\u10dc \u10db\u10d8\u10e1 \u10d2\u10d0\u10e0\u10d4\u10e8\u10d4."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/kk/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/kk/messages.json index dde4912..8917dd5 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/kk/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/kk/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u0416\u0410\u04a2\u0410\u0421\u042b\u041d \u0416\u0410\u0421\u0410\u0423"},"explanationofflinedisabled":{"message":"\u0421\u0456\u0437 \u043e\u0444\u043b\u0430\u0439\u043d \u0440\u0435\u0436\u0438\u043c\u0456\u043d\u0434\u0435\u0441\u0456\u0437. Google Docs \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0441\u044b\u043d \u0436\u0435\u043b\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u044b\u043d\u0441\u044b\u0437 \u049b\u043e\u043b\u0434\u0430\u043d\u0443 \u04af\u0448\u0456\u043d, \u043a\u0435\u043b\u0435\u0441\u0456 \u0436\u043e\u043b\u044b \u0436\u0435\u043b\u0456\u0433\u0435 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, Google Docs \u043d\u0435\u0433\u0456\u0437\u0433\u0456 \u0431\u0435\u0442\u0456\u043d\u0435\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u0431\u04e9\u043b\u0456\u043c\u0456\u043d \u043a\u0456\u0440\u0456\u043f, \u043e\u0444\u043b\u0430\u0439\u043d \u0440\u0435\u0436\u0438\u043c\u0456\u043d\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437."},"explanationofflineenabled":{"message":"\u0421\u0456\u0437 \u043e\u0444\u043b\u0430\u0439\u043d \u0440\u0435\u0436\u0438\u043c\u0456\u043d\u0434\u0435\u0441\u0456\u0437, \u0431\u0456\u0440\u0430\u049b \u043e\u0493\u0430\u043d \u049b\u0430\u0440\u0430\u043c\u0430\u0441\u0442\u0430\u043d \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u04e9\u04a3\u0434\u0435\u0443\u0456\u04a3\u0456\u0437\u0433\u0435 \u043d\u0435\u043c\u0435\u0441\u0435 \u0436\u0430\u04a3\u0430\u0441\u044b\u043d \u0436\u0430\u0441\u0430\u0443\u044b\u04a3\u044b\u0437\u0493\u0430 \u0431\u043e\u043b\u0430\u0434\u044b."},"extdesc":{"message":"\u049a\u04b1\u0436\u0430\u0442\u0442\u0430\u0440\u0434\u044b, \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0434\u044b\u049b \u043a\u0435\u0441\u0442\u0435\u043b\u0435\u0440\u0434\u0456, \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u043b\u0430\u0440\u0434\u044b \u04e9\u0437\u0433\u0435\u0440\u0442\u0443, \u0436\u0430\u0441\u0430\u0443 \u0436\u04d9\u043d\u0435 \u043a\u04e9\u0440\u0443 \u2013 \u0431\u0430\u0440\u043b\u044b\u0493\u044b \u043e\u0444\u043b\u0430\u0439\u043d \u0440\u0435\u0436\u0438\u043c\u0456\u043d\u0434\u0435."},"extname":{"message":"Google Docs \u043e\u0444\u043b\u0430\u0439\u043d"},"learnmore":{"message":"\u0422\u043e\u043b\u044b\u0493\u044b\u0440\u0430\u049b \u0430\u049b\u043f\u0430\u0440\u0430\u0442"},"popuphelptext":{"message":"\u0416\u0435\u043b\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u044b \u0431\u043e\u043b\u0441\u0430 \u0434\u0430, \u0431\u043e\u043b\u043c\u0430\u0441\u0430 \u0434\u0430, \u043a\u0435\u0437 \u043a\u0435\u043b\u0433\u0435\u043d \u0436\u0435\u0440\u0434\u0435\u043d \u0436\u0430\u0437\u0443, \u04e9\u04a3\u0434\u0435\u0443 \u0436\u04d9\u043d\u0435 \u0431\u0456\u0440\u043b\u0435\u0441\u0435 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u043d \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u04a3\u044b\u0437."}} +{"createnew":{"message":"\u0416\u0410\u04a2\u0410\u0421\u042b\u041d \u0416\u0410\u0421\u0410\u0423"},"explanationofflinedisabled":{"message":"\u0421\u0456\u0437 \u043e\u0444\u043b\u0430\u0439\u043d \u0440\u0435\u0436\u0438\u043c\u0456\u043d\u0434\u0435\u0441\u0456\u0437. Google Docs \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0441\u044b\u043d \u0436\u0435\u043b\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u044b\u043d\u0441\u044b\u0437 \u049b\u043e\u043b\u0434\u0430\u043d\u0443 \u04af\u0448\u0456\u043d, \u043a\u0435\u043b\u0435\u0441\u0456 \u0436\u043e\u043b\u044b \u0436\u0435\u043b\u0456\u0433\u0435 \u049b\u043e\u0441\u044b\u043b\u0493\u0430\u043d\u0434\u0430, Google Docs \u043d\u0435\u0433\u0456\u0437\u0433\u0456 \u0431\u0435\u0442\u0456\u043d\u0435\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440 \u0431\u04e9\u043b\u0456\u043c\u0456\u043d \u043a\u0456\u0440\u0456\u043f, \u043e\u0444\u043b\u0430\u0439\u043d \u0440\u0435\u0436\u0438\u043c\u0456\u043d\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0434\u0430\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u043d \u049b\u043e\u0441\u044b\u04a3\u044b\u0437."},"explanationofflineenabled":{"message":"\u0421\u0456\u0437 \u043e\u0444\u043b\u0430\u0439\u043d \u0440\u0435\u0436\u0438\u043c\u0456\u043d\u0434\u0435\u0441\u0456\u0437, \u0431\u0456\u0440\u0430\u049b \u043e\u0493\u0430\u043d \u049b\u0430\u0440\u0430\u043c\u0430\u0441\u0442\u0430\u043d \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b \u04e9\u04a3\u0434\u0435\u0443\u0456\u04a3\u0456\u0437\u0433\u0435 \u043d\u0435\u043c\u0435\u0441\u0435 \u0436\u0430\u04a3\u0430\u0441\u044b\u043d \u0436\u0430\u0441\u0430\u0443\u044b\u04a3\u044b\u0437\u0493\u0430 \u0431\u043e\u043b\u0430\u0434\u044b."},"extdesc":{"message":"\u049a\u04b1\u0436\u0430\u0442\u0442\u0430\u0440\u0434\u044b, \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u0434\u044b\u049b \u043a\u0435\u0441\u0442\u0435\u043b\u0435\u0440\u0434\u0456, \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u043b\u0430\u0440\u0434\u044b \u04e9\u0437\u0433\u0435\u0440\u0442\u0443, \u0436\u0430\u0441\u0430\u0443 \u0436\u04d9\u043d\u0435 \u043a\u04e9\u0440\u0443 \u2013 \u0431\u0430\u0440\u043b\u044b\u0493\u044b \u043e\u0444\u043b\u0430\u0439\u043d \u0440\u0435\u0436\u0438\u043c\u0456\u043d\u0434\u0435."},"extname":{"message":"Google Docs \u043e\u0444\u043b\u0430\u0439\u043d"},"learnmore":{"message":"\u0422\u043e\u043b\u044b\u0493\u044b\u0440\u0430\u049b \u0430\u049b\u043f\u0430\u0440\u0430\u0442"},"popuphelptext":{"message":"\u0416\u0435\u043b\u0456 \u0431\u0430\u0439\u043b\u0430\u043d\u044b\u0441\u044b \u0431\u043e\u043b\u0441\u0430 \u0434\u0430, \u0431\u043e\u043b\u043c\u0430\u0441\u0430 \u0434\u0430, \u043a\u0435\u0437 \u043a\u0435\u043b\u0433\u0435\u043d \u0436\u0435\u0440\u0434\u0435\u043d \u0436\u0430\u0437\u0443, \u04e9\u04a3\u0434\u0435\u0443 \u0436\u04d9\u043d\u0435 \u0431\u0456\u0440\u043b\u0435\u0441\u0435 \u0436\u04b1\u043c\u044b\u0441 \u0456\u0441\u0442\u0435\u0443 \u043c\u04af\u043c\u043a\u0456\u043d\u0434\u0456\u0433\u0456\u043d \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u04a3\u044b\u0437."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/km/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/km/messages.json index 68add3b..74bd52e 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/km/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/km/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u1794\u1784\u17d2\u1780\u17be\u178f\u200b\u1790\u17d2\u1798\u17b8"},"explanationofflinedisabled":{"message":"\u17a2\u17d2\u1793\u1780\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f\u17d4 \u178a\u17be\u1798\u17d2\u1794\u17b8\u200b\u1794\u17d2\u179a\u17be Google \u17af\u1780\u179f\u17b6\u179a\u200b\u1794\u17b6\u1793\u200b\u200b\u178a\u17c4\u1799\u200b\u200b\u1798\u17b7\u1793\u1798\u17b6\u1793\u200b\u200b\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f \u179f\u17bc\u1798\u200b\u200b\u1791\u17c5\u200b\u1780\u17b6\u1793\u17cb\u200b\u1780\u17b6\u179a\u200b\u1780\u17c6\u178e\u178f\u17cb\u200b\u1793\u17c5\u200b\u179b\u17be\u200b\u1782\u17c1\u17a0\u1791\u17c6\u1796\u17d0\u179a Google \u17af\u1780\u179f\u17b6\u179a \u1793\u17b7\u1784\u200b\u1794\u17be\u1780\u200b\u1780\u17b6\u179a\u1792\u17d2\u179c\u17be\u200b\u179f\u1798\u1780\u17b6\u179b\u1780\u1798\u17d2\u1798\u200b\u200b\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f\u200b\u200b\u1793\u17c5\u200b\u1796\u17c1\u179b\u200b\u1780\u17d2\u179a\u17c4\u1799\u200b\u178a\u17c2\u179b\u200b\u17a2\u17d2\u1793\u1780\u200b\u200b\u1794\u17b6\u1793\u200b\u1797\u17d2\u1787\u17b6\u1794\u17cb\u200b\u1791\u17c5\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f\u17d4"},"explanationofflineenabled":{"message":"\u17a2\u17d2\u1793\u1780\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f \u1794\u17c9\u17bb\u1793\u17d2\u178f\u17c2\u17a2\u17d2\u1793\u1780\u200b\u1793\u17c5\u200b\u178f\u17c2\u200b\u17a2\u17b6\u1785\u200b\u1780\u17c2\u179f\u1798\u17d2\u179a\u17bd\u179b\u200b\u17af\u1780\u179f\u17b6\u179a\u200b\u178a\u17c2\u179b\u200b\u1798\u17b6\u1793 \u17ac\u200b\u1794\u1784\u17d2\u1780\u17be\u178f\u200b\u17af\u1780\u179f\u17b6\u179a\u200b\u1790\u17d2\u1798\u17b8\u200b\u1794\u17b6\u1793\u17d4"},"extdesc":{"message":"\u1780\u17c2\u200b\u179f\u1798\u17d2\u179a\u17bd\u179b \u1794\u1784\u17d2\u1780\u17be\u178f \u1793\u17b7\u1784\u200b\u1798\u17be\u179b\u200b\u17af\u1780\u179f\u17b6\u179a \u1794\u1789\u17d2\u1787\u17b8 \u1793\u17b7\u1784\u200b\u1794\u1791\u200b\u1794\u1784\u17d2\u17a0\u17b6\u1789\u200b\u179a\u1794\u179f\u17cb\u200b\u17a2\u17d2\u1793\u1780 \u178a\u17c4\u1799\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f\u200b\u17d4"},"extname":{"message":"Google \u17af\u1780\u179f\u17b6\u179a\u200b\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f"},"learnmore":{"message":"\u179f\u17d2\u179c\u17c2\u1784\u200b\u1799\u179b\u17cb\u200b\u1794\u1793\u17d2\u1790\u17c2\u1798"},"popuphelptext":{"message":"\u179f\u179a\u179f\u17c1\u179a \u1780\u17c2\u179f\u1798\u17d2\u179a\u17bd\u179b \u1793\u17b7\u1784\u200b\u179f\u17a0\u1780\u17b6\u179a\u200b\u1793\u17c5\u200b\u1796\u17c1\u179b\u200b\u178e\u17b6\u200b\u178a\u17c2\u179b\u200b\u17a2\u17d2\u1793\u1780\u200b\u1798\u17b6\u1793 \u17ac\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f\u17d4"}} +{"createnew":{"message":"\u1794\u1784\u17d2\u1780\u17be\u178f\u200b\u1790\u17d2\u1798\u17b8"},"explanationofflinedisabled":{"message":"\u17a2\u17d2\u1793\u1780\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f\u17d4 \u178a\u17be\u1798\u17d2\u1794\u17b8\u200b\u1794\u17d2\u179a\u17be Google \u17af\u1780\u179f\u17b6\u179a\u200b\u1794\u17b6\u1793\u200b\u200b\u178a\u17c4\u1799\u200b\u200b\u1798\u17b7\u1793\u1798\u17b6\u1793\u200b\u200b\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f \u179f\u17bc\u1798\u200b\u200b\u1791\u17c5\u200b\u1780\u17b6\u1793\u17cb\u200b\u1780\u17b6\u179a\u200b\u1780\u17c6\u178e\u178f\u17cb\u200b\u1793\u17c5\u200b\u179b\u17be\u200b\u1782\u17c1\u17a0\u1791\u17c6\u1796\u17d0\u179a Google \u17af\u1780\u179f\u17b6\u179a \u1793\u17b7\u1784\u200b\u1794\u17be\u1780\u200b\u1780\u17b6\u179a\u1792\u17d2\u179c\u17be\u200b\u179f\u1798\u1780\u17b6\u179b\u1780\u1798\u17d2\u1798\u200b\u200b\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f\u200b\u200b\u1793\u17c5\u200b\u1796\u17c1\u179b\u200b\u1780\u17d2\u179a\u17c4\u1799\u200b\u178a\u17c2\u179b\u200b\u17a2\u17d2\u1793\u1780\u200b\u200b\u1794\u17b6\u1793\u200b\u1797\u17d2\u1787\u17b6\u1794\u17cb\u200b\u1791\u17c5\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f\u17d4"},"explanationofflineenabled":{"message":"\u17a2\u17d2\u1793\u1780\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f \u1794\u17c9\u17bb\u1793\u17d2\u178f\u17c2\u17a2\u17d2\u1793\u1780\u200b\u1793\u17c5\u200b\u178f\u17c2\u200b\u17a2\u17b6\u1785\u200b\u1780\u17c2\u179f\u1798\u17d2\u179a\u17bd\u179b\u200b\u17af\u1780\u179f\u17b6\u179a\u200b\u178a\u17c2\u179b\u200b\u1798\u17b6\u1793 \u17ac\u200b\u1794\u1784\u17d2\u1780\u17be\u178f\u200b\u17af\u1780\u179f\u17b6\u179a\u200b\u1790\u17d2\u1798\u17b8\u200b\u1794\u17b6\u1793\u17d4"},"extdesc":{"message":"\u1780\u17c2\u200b\u179f\u1798\u17d2\u179a\u17bd\u179b \u1794\u1784\u17d2\u1780\u17be\u178f \u1793\u17b7\u1784\u200b\u1798\u17be\u179b\u200b\u17af\u1780\u179f\u17b6\u179a \u1794\u1789\u17d2\u1787\u17b8 \u1793\u17b7\u1784\u200b\u1794\u1791\u200b\u1794\u1784\u17d2\u17a0\u17b6\u1789\u200b\u179a\u1794\u179f\u17cb\u200b\u17a2\u17d2\u1793\u1780 \u178a\u17c4\u1799\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f\u200b\u17d4"},"extname":{"message":"Google \u17af\u1780\u179f\u17b6\u179a\u200b\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f"},"learnmore":{"message":"\u179f\u17d2\u179c\u17c2\u1784\u200b\u1799\u179b\u17cb\u200b\u1794\u1793\u17d2\u1790\u17c2\u1798"},"popuphelptext":{"message":"\u179f\u179a\u179f\u17c1\u179a \u1780\u17c2\u179f\u1798\u17d2\u179a\u17bd\u179b \u1793\u17b7\u1784\u200b\u179f\u17a0\u1780\u17b6\u179a\u200b\u1793\u17c5\u200b\u1796\u17c1\u179b\u200b\u178e\u17b6\u200b\u178a\u17c2\u179b\u200b\u17a2\u17d2\u1793\u1780\u200b\u1798\u17b6\u1793 \u17ac\u200b\u1782\u17d2\u1798\u17b6\u1793\u200b\u17a2\u17ca\u17b8\u1793\u1792\u17ba\u178e\u17b7\u178f\u17d4"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/lo/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/lo/messages.json index 971637f..e02d78b 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/lo/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/lo/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u0eaa\u0ec9\u0eb2\u0e87\u0ec3\u0edd\u0ec8"},"explanationofflinedisabled":{"message":"\u0e97\u0ec8\u0eb2\u0e99\u0ead\u0ead\u0e9a\u0ea5\u0eb2\u0e8d\u0ea2\u0eb9\u0ec8. \u0ec0\u0e9e\u0eb7\u0ec8\u0ead\u0ec3\u0e8a\u0ec9 Google Docs \u0ec2\u0e94\u0e8d\u0e9a\u0ecd\u0ec8\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8\u0ead\u0eb4\u0e99\u0ec0\u0e95\u0eb5\u0ec0\u0e99\u0eb1\u0e94, \u0ec3\u0eab\u0ec9\u0ec4\u0e9b\u0e97\u0eb5\u0ec8\u0e81\u0eb2\u0e99\u0e95\u0eb1\u0ec9\u0e87\u0e84\u0ec8\u0eb2\u0ec3\u0e99\u0edc\u0ec9\u0eb2 Google Docs \u0ec1\u0ea5\u0ec9\u0ea7\u0ec0\u0e9b\u0eb5\u0e94\u0ec3\u0e8a\u0ec9\u0e81\u0eb2\u0e99\u0e8a\u0eb4\u0ec9\u0e87\u0ec1\u0e9a\u0e9a\u0ead\u0ead\u0e9a\u0ea5\u0eb2\u0e8d\u0ec3\u0e99\u0ec0\u0e97\u0eb7\u0ec8\u0ead\u0e95\u0ecd\u0ec8\u0ec4\u0e9b\u0e97\u0eb5\u0ec8\u0e97\u0ec8\u0eb2\u0e99\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8\u0ead\u0eb4\u0e99\u0ec0\u0e95\u0eb5\u0ec0\u0e99\u0eb1\u0e94."},"explanationofflineenabled":{"message":"\u0e97\u0ec8\u0eb2\u0e99\u0ead\u0ead\u0e9a\u0ea5\u0eb2\u0e8d\u0ea2\u0eb9\u0ec8, \u0ec1\u0e95\u0ec8\u0e97\u0ec8\u0eb2\u0e99\u0e8d\u0eb1\u0e87\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ec1\u0e81\u0ec9\u0ec4\u0e82\u0ec4\u0e9f\u0ea5\u0ecc\u0e97\u0eb5\u0ec8\u0ec3\u0e8a\u0ec9\u0ec4\u0e94\u0ec9 \u0eab\u0ebc\u0eb7 \u0eaa\u0ec9\u0eb2\u0e87\u0ec4\u0e9f\u0ea5\u0ecc\u0ec3\u0edd\u0ec8\u0ec4\u0e94\u0ec9."},"extdesc":{"message":"\u0ec1\u0e81\u0ec9\u0ec4\u0e82, \u0eaa\u0ec9\u0eb2\u0e87 \u0ec1\u0ea5\u0eb0 \u0ec0\u0e9a\u0eb4\u0ec8\u0e87\u0ec0\u0ead\u0e81\u0eb0\u0eaa\u0eb2\u0e99, \u0eaa\u0eb0\u0ec0\u0e9b\u0ea3\u0e94\u0e8a\u0eb5\u0e94 \u0ec1\u0ea5\u0eb0 \u0e9e\u0ea3\u0eb5\u0ec0\u0e8a\u0eb1\u0e99\u0ec0\u0e97\u0ec0\u0e8a\u0eb4\u0e99\u0e82\u0ead\u0e87\u0e97\u0ec8\u0eb2\u0e99\u0ec2\u0e94\u0e8d\u0e9a\u0ecd\u0ec8\u0ec3\u0e8a\u0ec9\u0ead\u0eb4\u0e99\u0ec0\u0e95\u0eb5\u0ec0\u0e99\u0eb1\u0e94."},"extname":{"message":"Google Docs Offline"},"learnmore":{"message":"\u0eaa\u0eb6\u0e81\u0eaa\u0eb2\u0ec0\u0e9e\u0eb5\u0ec8\u0ea1\u0ec0\u0e95\u0eb5\u0ea1"},"popuphelptext":{"message":"\u0e82\u0ebd\u0e99, \u0ec1\u0e81\u0ec9\u0ec4\u0e82 \u0ec1\u0ea5\u0eb0 \u0ec0\u0eae\u0eb1\u0e94\u0ea7\u0ebd\u0e81\u0eae\u0ec8\u0ea7\u0ea1\u0e81\u0eb1\u0e99\u0e9a\u0ecd\u0ec8\u0ea7\u0ec8\u0eb2\u0e97\u0ec8\u0eb2\u0e99\u0e88\u0eb0\u0ea2\u0eb9\u0ec8\u0ec3\u0eaa\u0e81\u0ecd\u0e95\u0eb2\u0ea1, \u0e9a\u0ecd\u0ec8\u0ea7\u0ec8\u0eb2\u0e88\u0eb0\u0ea1\u0eb5\u0ead\u0eb4\u0e99\u0ec0\u0e95\u0eb5\u0ec0\u0e99\u0eb1\u0e94 \u0eab\u0ebc\u0eb7 \u0e9a\u0ecd\u0ec8\u0ea1\u0eb5\u0e81\u0ecd\u0e95\u0eb2\u0ea1."}} +{"createnew":{"message":"\u0eaa\u0ec9\u0eb2\u0e87\u0ec3\u0edd\u0ec8"},"explanationofflinedisabled":{"message":"\u0e97\u0ec8\u0eb2\u0e99\u0ead\u0ead\u0e9a\u0ea5\u0eb2\u0e8d\u0ea2\u0eb9\u0ec8. \u0ec0\u0e9e\u0eb7\u0ec8\u0ead\u0ec3\u0e8a\u0ec9 Google Docs \u0ec2\u0e94\u0e8d\u0e9a\u0ecd\u0ec8\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8\u0ead\u0eb4\u0e99\u0ec0\u0e95\u0eb5\u0ec0\u0e99\u0eb1\u0e94, \u0ec3\u0eab\u0ec9\u0ec4\u0e9b\u0e97\u0eb5\u0ec8\u0e81\u0eb2\u0e99\u0e95\u0eb1\u0ec9\u0e87\u0e84\u0ec8\u0eb2\u0ec3\u0e99\u0edc\u0ec9\u0eb2 Google Docs \u0ec1\u0ea5\u0ec9\u0ea7\u0ec0\u0e9b\u0eb5\u0e94\u0ec3\u0e8a\u0ec9\u0e81\u0eb2\u0e99\u0e8a\u0eb4\u0ec9\u0e87\u0ec1\u0e9a\u0e9a\u0ead\u0ead\u0e9a\u0ea5\u0eb2\u0e8d\u0ec3\u0e99\u0ec0\u0e97\u0eb7\u0ec8\u0ead\u0e95\u0ecd\u0ec8\u0ec4\u0e9b\u0e97\u0eb5\u0ec8\u0e97\u0ec8\u0eb2\u0e99\u0ec0\u0e8a\u0eb7\u0ec8\u0ead\u0ea1\u0e95\u0ecd\u0ec8\u0ead\u0eb4\u0e99\u0ec0\u0e95\u0eb5\u0ec0\u0e99\u0eb1\u0e94."},"explanationofflineenabled":{"message":"\u0e97\u0ec8\u0eb2\u0e99\u0ead\u0ead\u0e9a\u0ea5\u0eb2\u0e8d\u0ea2\u0eb9\u0ec8, \u0ec1\u0e95\u0ec8\u0e97\u0ec8\u0eb2\u0e99\u0e8d\u0eb1\u0e87\u0eaa\u0eb2\u0ea1\u0eb2\u0e94\u0ec1\u0e81\u0ec9\u0ec4\u0e82\u0ec4\u0e9f\u0ea5\u0ecc\u0e97\u0eb5\u0ec8\u0ec3\u0e8a\u0ec9\u0ec4\u0e94\u0ec9 \u0eab\u0ebc\u0eb7 \u0eaa\u0ec9\u0eb2\u0e87\u0ec4\u0e9f\u0ea5\u0ecc\u0ec3\u0edd\u0ec8\u0ec4\u0e94\u0ec9."},"extdesc":{"message":"\u0ec1\u0e81\u0ec9\u0ec4\u0e82, \u0eaa\u0ec9\u0eb2\u0e87 \u0ec1\u0ea5\u0eb0 \u0ec0\u0e9a\u0eb4\u0ec8\u0e87\u0ec0\u0ead\u0e81\u0eb0\u0eaa\u0eb2\u0e99, \u0eaa\u0eb0\u0ec0\u0e9b\u0ea3\u0e94\u0e8a\u0eb5\u0e94 \u0ec1\u0ea5\u0eb0 \u0e9e\u0ea3\u0eb5\u0ec0\u0e8a\u0eb1\u0e99\u0ec0\u0e97\u0ec0\u0e8a\u0eb4\u0e99\u0e82\u0ead\u0e87\u0e97\u0ec8\u0eb2\u0e99\u0ec2\u0e94\u0e8d\u0e9a\u0ecd\u0ec8\u0ec3\u0e8a\u0ec9\u0ead\u0eb4\u0e99\u0ec0\u0e95\u0eb5\u0ec0\u0e99\u0eb1\u0e94."},"extname":{"message":"Google Docs Offline"},"learnmore":{"message":"\u0eaa\u0eb6\u0e81\u0eaa\u0eb2\u0ec0\u0e9e\u0eb5\u0ec8\u0ea1\u0ec0\u0e95\u0eb5\u0ea1"},"popuphelptext":{"message":"\u0e82\u0ebd\u0e99, \u0ec1\u0e81\u0ec9\u0ec4\u0e82 \u0ec1\u0ea5\u0eb0 \u0ec0\u0eae\u0eb1\u0e94\u0ea7\u0ebd\u0e81\u0eae\u0ec8\u0ea7\u0ea1\u0e81\u0eb1\u0e99\u0e9a\u0ecd\u0ec8\u0ea7\u0ec8\u0eb2\u0e97\u0ec8\u0eb2\u0e99\u0e88\u0eb0\u0ea2\u0eb9\u0ec8\u0ec3\u0eaa\u0e81\u0ecd\u0e95\u0eb2\u0ea1, \u0e9a\u0ecd\u0ec8\u0ea7\u0ec8\u0eb2\u0e88\u0eb0\u0ea1\u0eb5\u0ead\u0eb4\u0e99\u0ec0\u0e95\u0eb5\u0ec0\u0e99\u0eb1\u0e94 \u0eab\u0ebc\u0eb7 \u0e9a\u0ecd\u0ec8\u0ea1\u0eb5\u0e81\u0ecd\u0e95\u0eb2\u0ea1."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mk/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mk/messages.json index 9c0c023..8f32690 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mk/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mk/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u0421\u041e\u0417\u0414\u0410\u0408\u0422\u0415 \u041d\u041e\u0412"},"explanationofflinedisabled":{"message":"\u041e\u0444\u043b\u0430\u0458\u043d \u0441\u0442\u0435. \u0417\u0430 \u0434\u0430 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 Google Docs \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u045a\u0435, \u043e\u0434\u0435\u0442\u0435 \u0432\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438\u0442\u0435 \u043d\u0430 \u043f\u043e\u0447\u0435\u0442\u043d\u0430\u0442\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0430 Google Docs \u0438 \u0432\u043a\u043b\u0443\u0447\u0435\u0442\u0435 \u0458\u0430 \u043e\u0444\u043b\u0430\u0458\u043d \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0458\u0430\u0442\u0430 \u0441\u043b\u0435\u0434\u043d\u0438\u043e\u0442 \u043f\u0430\u0442 \u043a\u043e\u0433\u0430 \u045c\u0435 \u0441\u0435 \u043f\u043e\u0432\u0440\u0437\u0435\u0442\u0435 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442."},"explanationofflineenabled":{"message":"\u041e\u0444\u043b\u0430\u0458\u043d \u0441\u0442\u0435, \u043d\u043e \u0441\u0435\u043f\u0430\u043a \u043c\u043e\u0436\u0435 \u0434\u0430 \u0438\u0437\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u043f\u043d\u0438 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0438 \u0438\u043b\u0438 \u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0435\u0442\u0435 \u043d\u043e\u0432\u0438."},"extdesc":{"message":"\u0418\u0437\u043c\u0435\u043d\u0443\u0432\u0430\u0458\u0442\u0435 \u0433\u0438, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0458\u0442\u0435 \u0433\u0438 \u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u0443\u0432\u0430\u0458\u0442\u0435 \u0433\u0438 \u0432\u0430\u0448\u0438\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438, \u0442\u0430\u0431\u0435\u043b\u0438 \u0438 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0431\u0435\u0437 \u043f\u0440\u0438\u0441\u0442\u0430\u043f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442."},"extname":{"message":"Google Docs Offline"},"learnmore":{"message":"\u0414\u043e\u0437\u043d\u0430\u0458\u0442\u0435 \u043f\u043e\u0432\u0435\u045c\u0435"},"popuphelptext":{"message":"\u041f\u0438\u0448\u0443\u0432\u0430\u0458\u0442\u0435, \u0438\u0437\u043c\u0435\u043d\u0443\u0432\u0430\u0458\u0442\u0435 \u0438 \u0441\u043e\u0440\u0430\u0431\u043e\u0442\u0443\u0432\u0430\u0458\u0442\u0435 \u043a\u0430\u0434\u0435 \u0438 \u0434\u0430 \u0441\u0442\u0435, \u0431\u0435\u0437 \u0440\u0430\u0437\u043b\u0438\u043a\u0430 \u0434\u0430\u043b\u0438 \u0438\u043c\u0430\u0442\u0435 \u0438\u043b\u0438 \u043d\u0435\u043c\u0430\u0442\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0432\u0440\u0441\u043a\u0430."}} +{"createnew":{"message":"\u0421\u041e\u0417\u0414\u0410\u0408\u0422\u0415 \u041d\u041e\u0412"},"explanationofflinedisabled":{"message":"\u041e\u0444\u043b\u0430\u0458\u043d \u0441\u0442\u0435. \u0417\u0430 \u0434\u0430 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 Google Docs \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u045a\u0435, \u043e\u0434\u0435\u0442\u0435 \u0432\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438\u0442\u0435 \u043d\u0430 \u043f\u043e\u0447\u0435\u0442\u043d\u0430\u0442\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0430 Google Docs \u0438 \u0432\u043a\u043b\u0443\u0447\u0435\u0442\u0435 \u0458\u0430 \u043e\u0444\u043b\u0430\u0458\u043d \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0458\u0430\u0442\u0430 \u0441\u043b\u0435\u0434\u043d\u0438\u043e\u0442 \u043f\u0430\u0442 \u043a\u043e\u0433\u0430 \u045c\u0435 \u0441\u0435 \u043f\u043e\u0432\u0440\u0437\u0435\u0442\u0435 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442."},"explanationofflineenabled":{"message":"\u041e\u0444\u043b\u0430\u0458\u043d \u0441\u0442\u0435, \u043d\u043e \u0441\u0435\u043f\u0430\u043a \u043c\u043e\u0436\u0435 \u0434\u0430 \u0438\u0437\u043c\u0435\u043d\u0443\u0432\u0430\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u043f\u043d\u0438 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0438 \u0438\u043b\u0438 \u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0435\u0442\u0435 \u043d\u043e\u0432\u0438."},"extdesc":{"message":"\u0418\u0437\u043c\u0435\u043d\u0443\u0432\u0430\u0458\u0442\u0435 \u0433\u0438, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0458\u0442\u0435 \u0433\u0438 \u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u0443\u0432\u0430\u0458\u0442\u0435 \u0433\u0438 \u0432\u0430\u0448\u0438\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438, \u0442\u0430\u0431\u0435\u043b\u0438 \u0438 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0431\u0435\u0437 \u043f\u0440\u0438\u0441\u0442\u0430\u043f \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442."},"extname":{"message":"Google Docs Offline"},"learnmore":{"message":"\u0414\u043e\u0437\u043d\u0430\u0458\u0442\u0435 \u043f\u043e\u0432\u0435\u045c\u0435"},"popuphelptext":{"message":"\u041f\u0438\u0448\u0443\u0432\u0430\u0458\u0442\u0435, \u0438\u0437\u043c\u0435\u043d\u0443\u0432\u0430\u0458\u0442\u0435 \u0438 \u0441\u043e\u0440\u0430\u0431\u043e\u0442\u0443\u0432\u0430\u0458\u0442\u0435 \u043a\u0430\u0434\u0435 \u0438 \u0434\u0430 \u0441\u0442\u0435, \u0431\u0435\u0437 \u0440\u0430\u0437\u043b\u0438\u043a\u0430 \u0434\u0430\u043b\u0438 \u0438\u043c\u0430\u0442\u0435 \u0438\u043b\u0438 \u043d\u0435\u043c\u0430\u0442\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0432\u0440\u0441\u043a\u0430."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mn/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mn/messages.json index 129f4bc..c984075 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mn/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/mn/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u0428\u0418\u041d\u0418\u0419\u0413 \u04ae\u04ae\u0421\u0413\u042d\u0425"},"explanationofflinedisabled":{"message":"\u0422\u0430 \u043e\u0444\u043b\u0430\u0439\u043d \u0431\u0430\u0439\u043d\u0430. Google \u0414\u043e\u043a\u044b\u0433 \u0438\u043d\u0442\u0435\u0440\u043d\u044d\u0442\u0433\u04af\u0439\u0433\u044d\u044d\u0440 \u0430\u0448\u0438\u0433\u043b\u0430\u0445\u044b\u043d \u0442\u0443\u043b\u0434 \u0434\u0430\u0440\u0430\u0430\u0433\u0438\u0439\u043d \u0443\u0434\u0430\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u044d\u0442\u044d\u0434 \u0445\u043e\u043b\u0431\u043e\u0433\u0434\u043e\u0445\u0434\u043e\u043e Google \u0414\u043e\u043a\u044b\u043d \u043d\u04af\u04af\u0440 \u0445\u0443\u0443\u0434\u0430\u0441\u043d\u0430\u0430\u0441 \u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e \u0434\u043e\u0442\u043e\u0440\u0445 \u043e\u0444\u043b\u0430\u0439\u043d \u0441\u0438\u043d\u043a\u0438\u0439\u0433 \u0438\u0434\u044d\u0432\u0445\u0436\u04af\u04af\u043b\u043d\u044d \u04af\u04af."},"explanationofflineenabled":{"message":"\u0422\u0430 \u043e\u0444\u043b\u0430\u0439\u043d \u0431\u0430\u0439\u043d\u0430, \u0433\u044d\u0445\u0434\u044d\u044d \u0431\u0430\u0439\u0433\u0430\u0430 \u0444\u0430\u0439\u043b\u0443\u0443\u0434\u044b\u0433 \u0437\u0430\u0441\u0430\u0445 \u0431\u0443\u044e\u0443 \u0448\u0438\u043d\u044d\u044d\u0440 \u04af\u04af\u0441\u0433\u044d\u0445 \u0431\u043e\u043b\u043e\u043c\u0436\u0442\u043e\u0439."},"extdesc":{"message":"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u0445\u04af\u0441\u043d\u044d\u0433\u0442 \u0431\u043e\u043b\u043e\u043d \u04af\u0437\u04af\u04af\u043b\u044d\u043d\u0433\u044d\u044d \u0437\u0430\u0441\u0430\u0445, \u04af\u04af\u0441\u0433\u044d\u0445 \u043c\u04e9\u043d \u0445\u0430\u0440\u0430\u0445 \u2014 \u0431\u04af\u0433\u0434\u0438\u0439\u0433 \u044f\u043c\u0430\u0440 \u0447 \u0438\u043d\u0442\u0435\u0440\u043d\u044d\u0442 \u0445\u0430\u043d\u0434\u0430\u043b\u0442\u0433\u04af\u0439\u0433\u044d\u044d\u0440 \u0445\u0438\u0439\u0445 \u0431\u043e\u043b\u043e\u043c\u0436\u0442\u043e\u0439."},"extname":{"message":"Google Docs \u041e\u0444\u043b\u0430\u0439\u043d"},"learnmore":{"message":"\u0414\u044d\u043b\u0433\u044d\u0440\u044d\u043d\u0433\u04af\u0439 \u04af\u0437\u044d\u0445"},"popuphelptext":{"message":"\u0418\u043d\u0442\u0435\u0440\u043d\u044d\u0442 \u0445\u043e\u043b\u0431\u043e\u043b\u0442\u0442\u043e\u0439 \u044d\u0441\u044d\u0445\u044d\u044d\u0441 \u04af\u043b \u0445\u0430\u043c\u0430\u0430\u0440\u0430\u043d, \u0445\u0430\u0430\u043d\u0430\u0430\u0441 \u0447 \u0431\u0438\u0447\u0438\u0445, \u0437\u0430\u0441\u0430\u0445, \u0445\u0430\u043c\u0442\u0440\u0430\u043d \u0430\u0436\u0438\u043b\u043b\u0430\u0445 \u0431\u043e\u043b\u043e\u043c\u0436\u0442\u043e\u0439."}} +{"createnew":{"message":"\u0428\u0418\u041d\u0418\u0419\u0413 \u04ae\u04ae\u0421\u0413\u042d\u0425"},"explanationofflinedisabled":{"message":"\u0422\u0430 \u043e\u0444\u043b\u0430\u0439\u043d \u0431\u0430\u0439\u043d\u0430. Google \u0414\u043e\u043a\u044b\u0433 \u0438\u043d\u0442\u0435\u0440\u043d\u044d\u0442\u0433\u04af\u0439\u0433\u044d\u044d\u0440 \u0430\u0448\u0438\u0433\u043b\u0430\u0445\u044b\u043d \u0442\u0443\u043b\u0434 \u0434\u0430\u0440\u0430\u0430\u0433\u0438\u0439\u043d \u0443\u0434\u0430\u0430 \u0438\u043d\u0442\u0435\u0440\u043d\u044d\u0442\u044d\u0434 \u0445\u043e\u043b\u0431\u043e\u0433\u0434\u043e\u0445\u0434\u043e\u043e Google \u0414\u043e\u043a\u044b\u043d \u043d\u04af\u04af\u0440 \u0445\u0443\u0443\u0434\u0430\u0441\u043d\u0430\u0430\u0441 \u0442\u043e\u0445\u0438\u0440\u0433\u043e\u043e \u0434\u043e\u0442\u043e\u0440\u0445 \u043e\u0444\u043b\u0430\u0439\u043d \u0441\u0438\u043d\u043a\u0438\u0439\u0433 \u0438\u0434\u044d\u0432\u0445\u0436\u04af\u04af\u043b\u043d\u044d \u04af\u04af."},"explanationofflineenabled":{"message":"\u0422\u0430 \u043e\u0444\u043b\u0430\u0439\u043d \u0431\u0430\u0439\u043d\u0430, \u0433\u044d\u0445\u0434\u044d\u044d \u0431\u0430\u0439\u0433\u0430\u0430 \u0444\u0430\u0439\u043b\u0443\u0443\u0434\u044b\u0433 \u0437\u0430\u0441\u0430\u0445 \u0431\u0443\u044e\u0443 \u0448\u0438\u043d\u044d\u044d\u0440 \u04af\u04af\u0441\u0433\u044d\u0445 \u0431\u043e\u043b\u043e\u043c\u0436\u0442\u043e\u0439."},"extdesc":{"message":"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u0445\u04af\u0441\u043d\u044d\u0433\u0442 \u0431\u043e\u043b\u043e\u043d \u04af\u0437\u04af\u04af\u043b\u044d\u043d\u0433\u044d\u044d \u0437\u0430\u0441\u0430\u0445, \u04af\u04af\u0441\u0433\u044d\u0445 \u043c\u04e9\u043d \u0445\u0430\u0440\u0430\u0445 \u2014 \u0431\u04af\u0433\u0434\u0438\u0439\u0433 \u044f\u043c\u0430\u0440 \u0447 \u0438\u043d\u0442\u0435\u0440\u043d\u044d\u0442 \u0445\u0430\u043d\u0434\u0430\u043b\u0442\u0433\u04af\u0439\u0433\u044d\u044d\u0440 \u0445\u0438\u0439\u0445 \u0431\u043e\u043b\u043e\u043c\u0436\u0442\u043e\u0439."},"extname":{"message":"Google Docs \u041e\u0444\u043b\u0430\u0439\u043d"},"learnmore":{"message":"\u0414\u044d\u043b\u0433\u044d\u0440\u044d\u043d\u0433\u04af\u0439 \u04af\u0437\u044d\u0445"},"popuphelptext":{"message":"\u0418\u043d\u0442\u0435\u0440\u043d\u044d\u0442 \u0445\u043e\u043b\u0431\u043e\u043b\u0442\u0442\u043e\u0439 \u044d\u0441\u044d\u0445\u044d\u044d\u0441 \u04af\u043b \u0445\u0430\u043c\u0430\u0430\u0440\u0430\u043d, \u0445\u0430\u0430\u043d\u0430\u0430\u0441 \u0447 \u0431\u0438\u0447\u0438\u0445, \u0437\u0430\u0441\u0430\u0445, \u0445\u0430\u043c\u0442\u0440\u0430\u043d \u0430\u0436\u0438\u043b\u043b\u0430\u0445 \u0431\u043e\u043b\u043e\u043c\u0436\u0442\u043e\u0439."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/my/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/my/messages.json index 01803b3..32ecf84 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/my/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/my/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u1021\u101e\u1005\u103a \u1015\u103c\u102f\u101c\u102f\u1015\u103a\u101b\u1014\u103a"},"explanationofflinedisabled":{"message":"\u101e\u1004\u103a \u1021\u1031\u102c\u1037\u1016\u103a\u101c\u102d\u102f\u1004\u103a\u1038\u1016\u103c\u1005\u103a\u1014\u1031\u1015\u102b\u101e\u100a\u103a\u104b \u1021\u1004\u103a\u1010\u102c\u1014\u1000\u103a\u1001\u103b\u102d\u1010\u103a\u1006\u1000\u103a\u1019\u103e\u102f \u1019\u101b\u103e\u102d\u1018\u1032 Google Docs \u1000\u102d\u102f \u1021\u101e\u102f\u1036\u1038\u1015\u103c\u102f\u101b\u1014\u103a \u1014\u1031\u102c\u1000\u103a\u1010\u1005\u103a\u1000\u103c\u102d\u1019\u103a \u101e\u1004\u103a\u1021\u1004\u103a\u1010\u102c\u1014\u1000\u103a\u1001\u103b\u102d\u1010\u103a\u1006\u1000\u103a\u101e\u100a\u1037\u103a\u1021\u1001\u102b Google Docs \u1015\u1004\u103a\u1019\u1005\u102c\u1019\u103b\u1000\u103a\u1014\u103e\u102c\u101b\u103e\u102d \u1006\u1000\u103a\u1010\u1004\u103a\u1019\u103b\u102c\u1038\u101e\u102d\u102f\u1037\u101e\u103d\u102c\u1038\u1015\u103c\u102e\u1038 \u1021\u1031\u102c\u1037\u1016\u103a\u101c\u102d\u102f\u1004\u103a\u1038\u1005\u1004\u1037\u103a\u1001\u103a\u1000\u102d\u102f \u1016\u103d\u1004\u1037\u103a\u101c\u102d\u102f\u1000\u103a\u1015\u102b\u104b"},"explanationofflineenabled":{"message":"\u101e\u1004\u103a \u1021\u1031\u102c\u1037\u1016\u103a\u101c\u102d\u102f\u1004\u103a\u1038 \u1016\u103c\u1005\u103a\u1014\u1031\u1015\u102b\u101e\u100a\u103a\u104b \u101e\u102d\u102f\u1037\u101e\u1031\u102c\u103a \u1021\u101e\u102f\u1036\u1038\u1015\u103c\u102f\u1014\u102d\u102f\u1004\u103a\u101e\u1031\u102c \u1016\u102d\u102f\u1004\u103a\u1019\u103b\u102c\u1038\u1000\u102d\u102f \u1006\u1000\u103a\u101c\u1000\u103a\u1010\u100a\u103a\u1038\u1016\u103c\u1010\u103a\u1014\u102d\u102f\u1004\u103a\u101e\u100a\u103a \u101e\u102d\u102f\u1037\u1019\u101f\u102f\u1010\u103a \u1021\u101e\u1005\u103a\u1019\u103b\u102c\u1038 \u1015\u103c\u102f\u101c\u102f\u1015\u103a\u1014\u102d\u102f\u1004\u103a\u101e\u100a\u103a\u104b"},"extdesc":{"message":"\u1021\u1004\u103a\u1010\u102c\u1014\u1000\u103a\u1021\u101e\u102f\u1036\u1038\u1019\u1015\u103c\u102f\u1018\u1032 \u2014 \u101e\u1004\u1037\u103a \u1005\u102c\u1016\u102d\u102f\u1004\u103a\u104a spreadsheet \u1014\u103e\u1004\u1037\u103a \u1010\u1004\u103a\u1015\u103c\u1019\u103e\u102f\u1019\u103b\u102c\u1038\u1000\u102d\u102f \u1010\u100a\u103a\u1038\u1016\u103c\u1010\u103a\u1001\u103c\u1004\u103a\u1038\u104a \u1021\u101e\u1005\u103a\u1016\u103d\u1004\u1037\u103a\u1001\u103c\u1004\u103a\u1038\u1014\u103e\u1004\u1037\u103a \u1000\u103c\u100a\u1037\u103a\u101b\u103e\u102f\u1001\u103c\u1004\u103a\u1038\u1010\u102d\u102f\u1037 \u1015\u103c\u102f\u101c\u102f\u1015\u103a\u1014\u102d\u102f\u1004\u103a\u1015\u102b\u101e\u100a\u103a\u104b"},"extname":{"message":"Google Docs \u1021\u1031\u102c\u1037\u1016\u103a\u101c\u102d\u102f\u1004\u103a\u1038"},"learnmore":{"message":"\u1015\u102d\u102f\u1019\u102d\u102f\u101c\u1031\u1037\u101c\u102c\u101b\u1014\u103a"},"popuphelptext":{"message":"\u1021\u1004\u103a\u1010\u102c\u1014\u1000\u103a\u1001\u103b\u102d\u1010\u103a\u1006\u1000\u103a\u1019\u103e\u102f \u101b\u103e\u102d\u101e\u100a\u103a\u1016\u103c\u1005\u103a\u1005\u1031\u104a \u1019\u101b\u103e\u102d\u101e\u100a\u103a\u1016\u103c\u1005\u103a\u1005\u1031 \u101b\u1031\u1038\u101e\u102c\u1038\u1001\u103c\u1004\u103a\u1038\u104a \u1010\u100a\u103a\u1038\u1016\u103c\u1010\u103a\u1001\u103c\u1004\u103a\u1038\u1014\u103e\u1004\u1037\u103a \u1015\u1030\u1038\u1015\u1031\u102b\u1004\u103a\u1038\u1006\u1031\u102c\u1004\u103a\u101b\u103d\u1000\u103a\u1001\u103c\u1004\u103a\u1038\u1010\u102d\u102f\u1037\u1000\u102d\u102f \u1014\u1031\u101b\u102c\u1019\u101b\u103d\u1031\u1038\u1015\u103c\u102f\u101c\u102f\u1015\u103a\u1014\u102d\u102f\u1004\u103a\u1015\u102b\u101e\u100a\u103a\u104b"}} +{"createnew":{"message":"\u1021\u101e\u1005\u103a \u1015\u103c\u102f\u101c\u102f\u1015\u103a\u101b\u1014\u103a"},"explanationofflinedisabled":{"message":"\u101e\u1004\u103a \u1021\u1031\u102c\u1037\u1016\u103a\u101c\u102d\u102f\u1004\u103a\u1038\u1016\u103c\u1005\u103a\u1014\u1031\u1015\u102b\u101e\u100a\u103a\u104b \u1021\u1004\u103a\u1010\u102c\u1014\u1000\u103a\u1001\u103b\u102d\u1010\u103a\u1006\u1000\u103a\u1019\u103e\u102f \u1019\u101b\u103e\u102d\u1018\u1032 Google Docs \u1000\u102d\u102f \u1021\u101e\u102f\u1036\u1038\u1015\u103c\u102f\u101b\u1014\u103a \u1014\u1031\u102c\u1000\u103a\u1010\u1005\u103a\u1000\u103c\u102d\u1019\u103a \u101e\u1004\u103a\u1021\u1004\u103a\u1010\u102c\u1014\u1000\u103a\u1001\u103b\u102d\u1010\u103a\u1006\u1000\u103a\u101e\u100a\u1037\u103a\u1021\u1001\u102b Google Docs \u1015\u1004\u103a\u1019\u1005\u102c\u1019\u103b\u1000\u103a\u1014\u103e\u102c\u101b\u103e\u102d \u1006\u1000\u103a\u1010\u1004\u103a\u1019\u103b\u102c\u1038\u101e\u102d\u102f\u1037\u101e\u103d\u102c\u1038\u1015\u103c\u102e\u1038 \u1021\u1031\u102c\u1037\u1016\u103a\u101c\u102d\u102f\u1004\u103a\u1038\u1005\u1004\u1037\u103a\u1001\u103a\u1000\u102d\u102f \u1016\u103d\u1004\u1037\u103a\u101c\u102d\u102f\u1000\u103a\u1015\u102b\u104b"},"explanationofflineenabled":{"message":"\u101e\u1004\u103a \u1021\u1031\u102c\u1037\u1016\u103a\u101c\u102d\u102f\u1004\u103a\u1038 \u1016\u103c\u1005\u103a\u1014\u1031\u1015\u102b\u101e\u100a\u103a\u104b \u101e\u102d\u102f\u1037\u101e\u1031\u102c\u103a \u1021\u101e\u102f\u1036\u1038\u1015\u103c\u102f\u1014\u102d\u102f\u1004\u103a\u101e\u1031\u102c \u1016\u102d\u102f\u1004\u103a\u1019\u103b\u102c\u1038\u1000\u102d\u102f \u1006\u1000\u103a\u101c\u1000\u103a\u1010\u100a\u103a\u1038\u1016\u103c\u1010\u103a\u1014\u102d\u102f\u1004\u103a\u101e\u100a\u103a \u101e\u102d\u102f\u1037\u1019\u101f\u102f\u1010\u103a \u1021\u101e\u1005\u103a\u1019\u103b\u102c\u1038 \u1015\u103c\u102f\u101c\u102f\u1015\u103a\u1014\u102d\u102f\u1004\u103a\u101e\u100a\u103a\u104b"},"extdesc":{"message":"\u1021\u1004\u103a\u1010\u102c\u1014\u1000\u103a\u1021\u101e\u102f\u1036\u1038\u1019\u1015\u103c\u102f\u1018\u1032 \u2014 \u101e\u1004\u1037\u103a \u1005\u102c\u1016\u102d\u102f\u1004\u103a\u104a spreadsheet \u1014\u103e\u1004\u1037\u103a \u1010\u1004\u103a\u1015\u103c\u1019\u103e\u102f\u1019\u103b\u102c\u1038\u1000\u102d\u102f \u1010\u100a\u103a\u1038\u1016\u103c\u1010\u103a\u1001\u103c\u1004\u103a\u1038\u104a \u1021\u101e\u1005\u103a\u1016\u103d\u1004\u1037\u103a\u1001\u103c\u1004\u103a\u1038\u1014\u103e\u1004\u1037\u103a \u1000\u103c\u100a\u1037\u103a\u101b\u103e\u102f\u1001\u103c\u1004\u103a\u1038\u1010\u102d\u102f\u1037 \u1015\u103c\u102f\u101c\u102f\u1015\u103a\u1014\u102d\u102f\u1004\u103a\u1015\u102b\u101e\u100a\u103a\u104b"},"extname":{"message":"Google Docs \u1021\u1031\u102c\u1037\u1016\u103a\u101c\u102d\u102f\u1004\u103a\u1038"},"learnmore":{"message":"\u1015\u102d\u102f\u1019\u102d\u102f\u101c\u1031\u1037\u101c\u102c\u101b\u1014\u103a"},"popuphelptext":{"message":"\u1021\u1004\u103a\u1010\u102c\u1014\u1000\u103a\u1001\u103b\u102d\u1010\u103a\u1006\u1000\u103a\u1019\u103e\u102f \u101b\u103e\u102d\u101e\u100a\u103a\u1016\u103c\u1005\u103a\u1005\u1031\u104a \u1019\u101b\u103e\u102d\u101e\u100a\u103a\u1016\u103c\u1005\u103a\u1005\u1031 \u101b\u1031\u1038\u101e\u102c\u1038\u1001\u103c\u1004\u103a\u1038\u104a \u1010\u100a\u103a\u1038\u1016\u103c\u1010\u103a\u1001\u103c\u1004\u103a\u1038\u1014\u103e\u1004\u1037\u103a \u1015\u1030\u1038\u1015\u1031\u102b\u1004\u103a\u1038\u1006\u1031\u102c\u1004\u103a\u101b\u103d\u1000\u103a\u1001\u103c\u1004\u103a\u1038\u1010\u102d\u102f\u1037\u1000\u102d\u102f \u1014\u1031\u101b\u102c\u1019\u101b\u103d\u1031\u1038\u1015\u103c\u102f\u101c\u102f\u1015\u103a\u1014\u102d\u102f\u1004\u103a\u1015\u102b\u101e\u100a\u103a\u104b"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/or/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/or/messages.json index e83597a..336f828 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/or/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/or/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u0b28\u0b42\u0b06 \u0b24\u0b3f\u0b06\u0b30\u0b3f \u0b15\u0b30\u0b28\u0b4d\u0b24\u0b41"},"explanationofflinedisabled":{"message":"\u0b06\u0b2a\u0b23 \u0b05\u0b2b\u0b32\u0b3e\u0b07\u0b28 \u0b05\u0b1b\u0b28\u0b4d\u0b24\u0b3f\u0964 \u0b0f\u0b15 \u0b07\u0b23\u0b4d\u0b1f\u0b30\u0b4d\u0b28\u0b47\u0b1f \u0b15\u0b28\u0b47\u0b15\u0b4d\u0b38\u0b28 \u0b2c\u0b3f\u0b28\u0b3e Google Docs \u0b2c\u0b4d\u0b5f\u0b2c\u0b39\u0b3e\u0b30 \u0b15\u0b30\u0b3f\u0b2c\u0b3e\u0b15\u0b41 Google Docs \u0b39\u0b4b\u0b2e\u0b2a\u0b47\u0b1c\u0b30\u0b47 \u0b38\u0b47\u0b1f\u0b3f\u0b02\u0b38\u0b15\u0b41 \u0b2f\u0b3e\u0b06\u0b28\u0b4d\u0b24\u0b41 \u0b0f\u0b2c\u0b02 \u0b2a\u0b30\u0b2c\u0b30\u0b4d\u0b24\u0b4d\u0b24\u0b40 \u0b38\u0b2e\u0b5f\u0b30\u0b47 \u0b06\u0b2a\u0b23 \u0b07\u0b23\u0b4d\u0b1f\u0b30\u0b4d\u0b28\u0b47\u0b1f \u0b38\u0b39 \u0b15\u0b28\u0b47\u0b15\u0b4d\u0b1f \u0b39\u0b47\u0b2c\u0b3e \u0b2a\u0b30\u0b47 \u0b05\u0b2b\u0b32\u0b3e\u0b07\u0b28 \u0b38\u0b3f\u0b19\u0b4d\u0b15\u0b15\u0b41 \u0b1a\u0b3e\u0b32\u0b41 \u0b15\u0b30\u0b28\u0b4d\u0b24\u0b41\u0964"},"explanationofflineenabled":{"message":"\u0b06\u0b2a\u0b23 \u0b05\u0b2b\u0b32\u0b3e\u0b07\u0b28 \u0b05\u0b1b\u0b28\u0b4d\u0b24\u0b3f \u0b15\u0b3f\u0b28\u0b4d\u0b24\u0b41 \u0b06\u0b2a\u0b23 \u0b0f\u0b2c\u0b47 \u0b2c\u0b3f \u0b09\u0b2a\u0b32\u0b2c\u0b4d\u0b27 \u0b2b\u0b3e\u0b07\u0b32\u0b17\u0b41\u0b5c\u0b3f\u0b15\u0b41 \u0b0f\u0b21\u0b3f\u0b1f \u0b15\u0b30\u0b3f\u0b2a\u0b3e\u0b30\u0b3f\u0b2c\u0b47 \u0b15\u0b3f\u0b2e\u0b4d\u0b71\u0b3e \u0b28\u0b42\u0b06 \u0b2b\u0b3e\u0b07\u0b32 \u0b24\u0b3f\u0b06\u0b30\u0b3f \u0b15\u0b30\u0b3f\u0b2a\u0b3e\u0b30\u0b3f\u0b2c\u0b47\u0964"},"extdesc":{"message":"\u0b21\u0b15\u0b4d\u0b5f\u0b41\u0b2e\u0b47\u0b23\u0b4d\u0b1f, \u0b38\u0b4d\u0b2a\u0b47\u0b21\u0b38\u0b3f\u0b1f \u0b13 \u0b2a\u0b4d\u0b30\u0b47\u0b1c\u0b47\u0b23\u0b4d\u0b1f\u0b47\u0b38\u0b28\u0b15\u0b41 \u0b0f\u0b21\u0b3f\u0b1f, \u0b24\u0b3f\u0b06\u0b30\u0b3f \u0b0f\u0b2c\u0b02 \u0b2d\u0b4d\u0b5f\u0b41 \u0b15\u0b30\u0b28\u0b4d\u0b24\u0b41 \u2014 \u0b38\u0b2c\u0b41 \u0b15\u0b3f\u0b1b\u0b3f \u0b07\u0b23\u0b4d\u0b1f\u0b30\u0b4d\u0b28\u0b47\u0b1f \u0b06\u0b15\u0b4d\u0b38\u0b47\u0b38 \u0b2c\u0b3f\u0b28\u0b3e\u0964"},"extname":{"message":"Google Docs \u0b05\u0b2b\u0b32\u0b3e\u0b07\u0b28"},"learnmore":{"message":"\u0b05\u0b27\u0b3f\u0b15 \u0b1c\u0b3e\u0b23\u0b28\u0b4d\u0b24\u0b41"},"popuphelptext":{"message":"\u0b07\u0b23\u0b4d\u0b1f\u0b30\u0b4d\u0b28\u0b47\u0b1f \u0b15\u0b28\u0b47\u0b15\u0b4d\u0b38\u0b28 \u0b38\u0b39\u0b3f\u0b24 \u0b15\u0b3f\u0b2e\u0b4d\u0b2c\u0b3e \u0b2c\u0b3f\u0b28\u0b3e \u0b06\u0b2a\u0b23 \u0b2f\u0b47\u0b09\u0b01\u0b20\u0b3e\u0b30\u0b47 \u0b05\u0b1b\u0b28\u0b4d\u0b24\u0b3f, \u0b38\u0b47\u0b20\u0b3e\u0b30\u0b47 \u0b32\u0b47\u0b16\u0b28\u0b4d\u0b24\u0b41, \u0b0f\u0b21\u0b3f\u0b1f \u0b15\u0b30\u0b28\u0b4d\u0b24\u0b41 \u0b0f\u0b2c\u0b02 \u0b38\u0b39\u0b2f\u0b4b\u0b17 \u0b15\u0b30\u0b28\u0b4d\u0b24\u0b41\u0964"}} +{"createnew":{"message":"\u0b28\u0b42\u0b06 \u0b24\u0b3f\u0b06\u0b30\u0b3f \u0b15\u0b30\u0b28\u0b4d\u0b24\u0b41"},"explanationofflinedisabled":{"message":"\u0b06\u0b2a\u0b23 \u0b05\u0b2b\u0b32\u0b3e\u0b07\u0b28 \u0b05\u0b1b\u0b28\u0b4d\u0b24\u0b3f\u0964 \u0b0f\u0b15 \u0b07\u0b23\u0b4d\u0b1f\u0b30\u0b4d\u0b28\u0b47\u0b1f \u0b15\u0b28\u0b47\u0b15\u0b4d\u0b38\u0b28 \u0b2c\u0b3f\u0b28\u0b3e Google Docs \u0b2c\u0b4d\u0b5f\u0b2c\u0b39\u0b3e\u0b30 \u0b15\u0b30\u0b3f\u0b2c\u0b3e\u0b15\u0b41 Google Docs \u0b39\u0b4b\u0b2e\u0b2a\u0b47\u0b1c\u0b30\u0b47 \u0b38\u0b47\u0b1f\u0b3f\u0b02\u0b38\u0b15\u0b41 \u0b2f\u0b3e\u0b06\u0b28\u0b4d\u0b24\u0b41 \u0b0f\u0b2c\u0b02 \u0b2a\u0b30\u0b2c\u0b30\u0b4d\u0b24\u0b4d\u0b24\u0b40 \u0b38\u0b2e\u0b5f\u0b30\u0b47 \u0b06\u0b2a\u0b23 \u0b07\u0b23\u0b4d\u0b1f\u0b30\u0b4d\u0b28\u0b47\u0b1f \u0b38\u0b39 \u0b15\u0b28\u0b47\u0b15\u0b4d\u0b1f \u0b39\u0b47\u0b2c\u0b3e \u0b2a\u0b30\u0b47 \u0b05\u0b2b\u0b32\u0b3e\u0b07\u0b28 \u0b38\u0b3f\u0b19\u0b4d\u0b15\u0b15\u0b41 \u0b1a\u0b3e\u0b32\u0b41 \u0b15\u0b30\u0b28\u0b4d\u0b24\u0b41\u0964"},"explanationofflineenabled":{"message":"\u0b06\u0b2a\u0b23 \u0b05\u0b2b\u0b32\u0b3e\u0b07\u0b28 \u0b05\u0b1b\u0b28\u0b4d\u0b24\u0b3f \u0b15\u0b3f\u0b28\u0b4d\u0b24\u0b41 \u0b06\u0b2a\u0b23 \u0b0f\u0b2c\u0b47 \u0b2c\u0b3f \u0b09\u0b2a\u0b32\u0b2c\u0b4d\u0b27 \u0b2b\u0b3e\u0b07\u0b32\u0b17\u0b41\u0b5c\u0b3f\u0b15\u0b41 \u0b0f\u0b21\u0b3f\u0b1f \u0b15\u0b30\u0b3f\u0b2a\u0b3e\u0b30\u0b3f\u0b2c\u0b47 \u0b15\u0b3f\u0b2e\u0b4d\u0b71\u0b3e \u0b28\u0b42\u0b06 \u0b2b\u0b3e\u0b07\u0b32 \u0b24\u0b3f\u0b06\u0b30\u0b3f \u0b15\u0b30\u0b3f\u0b2a\u0b3e\u0b30\u0b3f\u0b2c\u0b47\u0964"},"extdesc":{"message":"\u0b21\u0b15\u0b4d\u0b5f\u0b41\u0b2e\u0b47\u0b23\u0b4d\u0b1f, \u0b38\u0b4d\u0b2a\u0b47\u0b21\u0b38\u0b3f\u0b1f \u0b13 \u0b2a\u0b4d\u0b30\u0b47\u0b1c\u0b47\u0b23\u0b4d\u0b1f\u0b47\u0b38\u0b28\u0b15\u0b41 \u0b0f\u0b21\u0b3f\u0b1f, \u0b24\u0b3f\u0b06\u0b30\u0b3f \u0b0f\u0b2c\u0b02 \u0b2d\u0b4d\u0b5f\u0b41 \u0b15\u0b30\u0b28\u0b4d\u0b24\u0b41 \u2014 \u0b38\u0b2c\u0b41 \u0b15\u0b3f\u0b1b\u0b3f \u0b07\u0b23\u0b4d\u0b1f\u0b30\u0b4d\u0b28\u0b47\u0b1f \u0b06\u0b15\u0b4d\u0b38\u0b47\u0b38 \u0b2c\u0b3f\u0b28\u0b3e\u0964"},"extname":{"message":"Google Docs \u0b05\u0b2b\u0b32\u0b3e\u0b07\u0b28"},"learnmore":{"message":"\u0b05\u0b27\u0b3f\u0b15 \u0b1c\u0b3e\u0b23\u0b28\u0b4d\u0b24\u0b41"},"popuphelptext":{"message":"\u0b07\u0b23\u0b4d\u0b1f\u0b30\u0b4d\u0b28\u0b47\u0b1f \u0b15\u0b28\u0b47\u0b15\u0b4d\u0b38\u0b28 \u0b38\u0b39\u0b3f\u0b24 \u0b15\u0b3f\u0b2e\u0b4d\u0b2c\u0b3e \u0b2c\u0b3f\u0b28\u0b3e \u0b06\u0b2a\u0b23 \u0b2f\u0b47\u0b09\u0b01\u0b20\u0b3e\u0b30\u0b47 \u0b05\u0b1b\u0b28\u0b4d\u0b24\u0b3f, \u0b38\u0b47\u0b20\u0b3e\u0b30\u0b47 \u0b32\u0b47\u0b16\u0b28\u0b4d\u0b24\u0b41, \u0b0f\u0b21\u0b3f\u0b1f \u0b15\u0b30\u0b28\u0b4d\u0b24\u0b41 \u0b0f\u0b2c\u0b02 \u0b38\u0b39\u0b2f\u0b4b\u0b17 \u0b15\u0b30\u0b28\u0b4d\u0b24\u0b41\u0964"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pa/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pa/messages.json index 80d2951..7ccc65f 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pa/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/pa/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u0a28\u0a35\u0a3e\u0a02 \u0a2c\u0a23\u0a3e\u0a13"},"explanationofflinedisabled":{"message":"\u0a24\u0a41\u0a38\u0a40\u0a02 \u0a06\u0a2b\u0a3c\u0a32\u0a3e\u0a08\u0a28 \u0a39\u0a4b\u0964 \u0a07\u0a70\u0a1f\u0a30\u0a28\u0a48\u0a71\u0a1f \u0a15\u0a28\u0a48\u0a15\u0a36\u0a28 \u0a26\u0a47 \u0a2c\u0a3f\u0a28\u0a3e\u0a02 Google Docs \u0a28\u0a42\u0a70 \u0a35\u0a30\u0a24\u0a23 \u0a32\u0a08, \u0a05\u0a17\u0a32\u0a40 \u0a35\u0a3e\u0a30 \u0a1c\u0a26\u0a4b\u0a02 \u0a24\u0a41\u0a38\u0a40\u0a02 \u0a07\u0a70\u0a1f\u0a30\u0a28\u0a48\u0a71\u0a1f \u0a26\u0a47 \u0a28\u0a3e\u0a32 \u0a15\u0a28\u0a48\u0a15\u0a1f \u0a39\u0a4b\u0a35\u0a4b \u0a24\u0a3e\u0a02 Google Docs \u0a2e\u0a41\u0a71\u0a16 \u0a2a\u0a70\u0a28\u0a47 '\u0a24\u0a47 \u0a38\u0a48\u0a1f\u0a3f\u0a70\u0a17\u0a3e\u0a02 \u0a35\u0a3f\u0a71\u0a1a \u0a1c\u0a3e\u0a13 \u0a05\u0a24\u0a47 \u0a06\u0a2b\u0a3c\u0a32\u0a3e\u0a08\u0a28 \u0a38\u0a3f\u0a70\u0a15 \u0a28\u0a42\u0a70 \u0a1a\u0a3e\u0a32\u0a42 \u0a15\u0a30\u0a4b\u0964"},"explanationofflineenabled":{"message":"\u0a24\u0a41\u0a38\u0a40\u0a02 \u0a06\u0a2b\u0a3c\u0a32\u0a3e\u0a08\u0a28 \u0a39\u0a4b, \u0a2a\u0a30 \u0a24\u0a41\u0a38\u0a40\u0a02 \u0a39\u0a3e\u0a32\u0a47 \u0a35\u0a40 \u0a09\u0a2a\u0a32\u0a2c\u0a27 \u0a5e\u0a3e\u0a08\u0a32\u0a3e\u0a02 \u0a26\u0a3e \u0a38\u0a70\u0a2a\u0a3e\u0a26\u0a28 \u0a15\u0a30 \u0a38\u0a15\u0a26\u0a47 \u0a39\u0a4b \u0a1c\u0a3e\u0a02 \u0a28\u0a35\u0a40\u0a06\u0a02 \u0a5e\u0a3e\u0a08\u0a32\u0a3e\u0a02 \u0a2c\u0a23\u0a3e \u0a38\u0a15\u0a26\u0a47 \u0a39\u0a4b\u0964"},"extdesc":{"message":"\u0a2c\u0a3f\u0a28\u0a3e\u0a02 \u0a15\u0a3f\u0a38\u0a47 \u0a07\u0a70\u0a1f\u0a30\u0a28\u0a48\u0a71\u0a1f \u0a2a\u0a39\u0a41\u0a70\u0a1a \u0a26\u0a47 \u0a06\u0a2a\u0a23\u0a47 \u0a26\u0a38\u0a24\u0a3e\u0a35\u0a47\u0a5b\u0a3e\u0a02, \u0a38\u0a2a\u0a30\u0a48\u0a71\u0a21\u0a38\u0a3c\u0a40\u0a1f\u0a3e\u0a02 \u0a05\u0a24\u0a47 \u0a2a\u0a47\u0a38\u0a3c\u0a15\u0a3e\u0a30\u0a40\u0a06\u0a02 \u0a26\u0a3e \u0a38\u0a70\u0a2a\u0a3e\u0a26\u0a28 \u0a15\u0a30\u0a4b, \u0a2c\u0a23\u0a3e\u0a13 \u0a05\u0a24\u0a47 \u0a26\u0a47\u0a16\u0a4b\u0964"},"extname":{"message":"Google Docs \u0a14\u0a5e\u0a32\u0a3e\u0a08\u0a28"},"learnmore":{"message":"\u0a39\u0a4b\u0a30 \u0a1c\u0a3e\u0a23\u0a4b"},"popuphelptext":{"message":"\u0a24\u0a41\u0a38\u0a40\u0a02 \u0a1c\u0a3f\u0a71\u0a25\u0a47 \u0a35\u0a40 \u0a39\u0a4b, \u0a2d\u0a3e\u0a35\u0a47\u0a02 \u0a07\u0a70\u0a1f\u0a30\u0a28\u0a48\u0a71\u0a1f \u0a15\u0a28\u0a48\u0a15\u0a38\u0a3c\u0a28 \u0a26\u0a47 \u0a28\u0a3e\u0a32 \u0a1c\u0a3e\u0a02 \u0a07\u0a38\u0a26\u0a47 \u0a2c\u0a3f\u0a28\u0a3e\u0a02, \u0a09\u0a71\u0a25\u0a4b\u0a02 \u0a32\u0a3f\u0a16\u0a4b, \u0a38\u0a70\u0a2a\u0a3e\u0a26\u0a28 \u0a15\u0a30\u0a4b, \u0a05\u0a24\u0a47 \u0a38\u0a39\u0a3f\u0a2f\u0a4b\u0a17 \u0a15\u0a30\u0a4b\u0964"}} +{"createnew":{"message":"\u0a28\u0a35\u0a3e\u0a02 \u0a2c\u0a23\u0a3e\u0a13"},"explanationofflinedisabled":{"message":"\u0a24\u0a41\u0a38\u0a40\u0a02 \u0a06\u0a2b\u0a3c\u0a32\u0a3e\u0a08\u0a28 \u0a39\u0a4b\u0964 \u0a07\u0a70\u0a1f\u0a30\u0a28\u0a48\u0a71\u0a1f \u0a15\u0a28\u0a48\u0a15\u0a36\u0a28 \u0a26\u0a47 \u0a2c\u0a3f\u0a28\u0a3e\u0a02 Google Docs \u0a28\u0a42\u0a70 \u0a35\u0a30\u0a24\u0a23 \u0a32\u0a08, \u0a05\u0a17\u0a32\u0a40 \u0a35\u0a3e\u0a30 \u0a1c\u0a26\u0a4b\u0a02 \u0a24\u0a41\u0a38\u0a40\u0a02 \u0a07\u0a70\u0a1f\u0a30\u0a28\u0a48\u0a71\u0a1f \u0a26\u0a47 \u0a28\u0a3e\u0a32 \u0a15\u0a28\u0a48\u0a15\u0a1f \u0a39\u0a4b\u0a35\u0a4b \u0a24\u0a3e\u0a02 Google Docs \u0a2e\u0a41\u0a71\u0a16 \u0a2a\u0a70\u0a28\u0a47 '\u0a24\u0a47 \u0a38\u0a48\u0a1f\u0a3f\u0a70\u0a17\u0a3e\u0a02 \u0a35\u0a3f\u0a71\u0a1a \u0a1c\u0a3e\u0a13 \u0a05\u0a24\u0a47 \u0a06\u0a2b\u0a3c\u0a32\u0a3e\u0a08\u0a28 \u0a38\u0a3f\u0a70\u0a15 \u0a28\u0a42\u0a70 \u0a1a\u0a3e\u0a32\u0a42 \u0a15\u0a30\u0a4b\u0964"},"explanationofflineenabled":{"message":"\u0a24\u0a41\u0a38\u0a40\u0a02 \u0a06\u0a2b\u0a3c\u0a32\u0a3e\u0a08\u0a28 \u0a39\u0a4b, \u0a2a\u0a30 \u0a24\u0a41\u0a38\u0a40\u0a02 \u0a39\u0a3e\u0a32\u0a47 \u0a35\u0a40 \u0a09\u0a2a\u0a32\u0a2c\u0a27 \u0a5e\u0a3e\u0a08\u0a32\u0a3e\u0a02 \u0a26\u0a3e \u0a38\u0a70\u0a2a\u0a3e\u0a26\u0a28 \u0a15\u0a30 \u0a38\u0a15\u0a26\u0a47 \u0a39\u0a4b \u0a1c\u0a3e\u0a02 \u0a28\u0a35\u0a40\u0a06\u0a02 \u0a5e\u0a3e\u0a08\u0a32\u0a3e\u0a02 \u0a2c\u0a23\u0a3e \u0a38\u0a15\u0a26\u0a47 \u0a39\u0a4b\u0964"},"extdesc":{"message":"\u0a2c\u0a3f\u0a28\u0a3e\u0a02 \u0a15\u0a3f\u0a38\u0a47 \u0a07\u0a70\u0a1f\u0a30\u0a28\u0a48\u0a71\u0a1f \u0a2a\u0a39\u0a41\u0a70\u0a1a \u0a26\u0a47 \u0a06\u0a2a\u0a23\u0a47 \u0a26\u0a38\u0a24\u0a3e\u0a35\u0a47\u0a5b\u0a3e\u0a02, \u0a38\u0a2a\u0a30\u0a48\u0a71\u0a21\u0a38\u0a3c\u0a40\u0a1f\u0a3e\u0a02 \u0a05\u0a24\u0a47 \u0a2a\u0a47\u0a38\u0a3c\u0a15\u0a3e\u0a30\u0a40\u0a06\u0a02 \u0a26\u0a3e \u0a38\u0a70\u0a2a\u0a3e\u0a26\u0a28 \u0a15\u0a30\u0a4b, \u0a2c\u0a23\u0a3e\u0a13 \u0a05\u0a24\u0a47 \u0a26\u0a47\u0a16\u0a4b\u0964"},"extname":{"message":"Google Docs \u0a14\u0a5e\u0a32\u0a3e\u0a08\u0a28"},"learnmore":{"message":"\u0a39\u0a4b\u0a30 \u0a1c\u0a3e\u0a23\u0a4b"},"popuphelptext":{"message":"\u0a24\u0a41\u0a38\u0a40\u0a02 \u0a1c\u0a3f\u0a71\u0a25\u0a47 \u0a35\u0a40 \u0a39\u0a4b, \u0a2d\u0a3e\u0a35\u0a47\u0a02 \u0a07\u0a70\u0a1f\u0a30\u0a28\u0a48\u0a71\u0a1f \u0a15\u0a28\u0a48\u0a15\u0a38\u0a3c\u0a28 \u0a26\u0a47 \u0a28\u0a3e\u0a32 \u0a1c\u0a3e\u0a02 \u0a07\u0a38\u0a26\u0a47 \u0a2c\u0a3f\u0a28\u0a3e\u0a02, \u0a09\u0a71\u0a25\u0a4b\u0a02 \u0a32\u0a3f\u0a16\u0a4b, \u0a38\u0a70\u0a2a\u0a3e\u0a26\u0a28 \u0a15\u0a30\u0a4b, \u0a05\u0a24\u0a47 \u0a38\u0a39\u0a3f\u0a2f\u0a4b\u0a17 \u0a15\u0a30\u0a4b\u0964"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/si/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/si/messages.json index 5433d4d..0774484 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/si/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/si/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u0db1\u0dc0 \u0dbd\u0dda\u0d9b\u0db1\u0dba\u0d9a\u0dca \u0dc3\u0dcf\u0daf\u0db1\u0dca\u0db1"},"explanationofflinedisabled":{"message":"\u0d94\u0db6 \u0db1\u0ddc\u0db6\u0dd0\u0db3\u0dd2\u0dba. \u0d85\u0db1\u0dca\u0dad\u0dbb\u0dca\u0da2\u0dcf\u0dbd \u0dc3\u0db8\u0dca\u0db6\u0db1\u0dca\u0db0\u0dad\u0dcf\u0dc0\u0d9a\u0dca \u0db1\u0ddc\u0db8\u0dd0\u0dad\u0dd2\u0dc0 Google Docs \u0db7\u0dcf\u0dc0\u0dd2\u0dad \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0da7, Google Docs \u0db8\u0dd4\u0dbd\u0dca \u0db4\u0dd2\u0da7\u0dd4\u0dc0 \u0db8\u0dad \u0dc3\u0dd0\u0d9a\u0dc3\u0dd3\u0db8\u0dca \u0dc0\u0dd9\u0dad \u0d9c\u0ddc\u0dc3\u0dca \u0d94\u0db6 \u0d8a\u0dc5\u0d9f \u0d85\u0dc0\u0dc3\u0dca\u0dae\u0dcf\u0dc0\u0dda \u0d85\u0db1\u0dca\u0dad\u0dbb\u0dca\u0da2\u0dcf\u0dbd\u0dba\u0da7 \u0dc3\u0db6\u0dd0\u0db3\u0dd2 \u0dc0\u0dd2\u0da7 \u0db1\u0ddc\u0db6\u0dd0\u0db3\u0dd2 \u0dc3\u0db8\u0db8\u0dd4\u0dc4\u0dd4\u0dbb\u0dca\u0dad \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 \u0d9a\u0dca\u200d\u0dbb\u0dd2\u0dba\u0dcf\u0dad\u0dca\u0db8\u0d9a \u0d9a\u0dbb\u0db1\u0dca\u0db1."},"explanationofflineenabled":{"message":"\u0d94\u0db6 \u0db1\u0ddc\u0db6\u0dd0\u0db3\u0dd2\u0dba. \u0db1\u0db8\u0dd4\u0dad\u0dca \u0d94\u0db6\u0da7 \u0dad\u0dc0\u0db8 \u0dbd\u0db6\u0dcf \u0d9c\u0dad \u0dc4\u0dd0\u0d9a\u0dd2 \u0d9c\u0ddc\u0db1\u0dd4 \u0dc3\u0d82\u0dc3\u0dca\u0d9a\u0dbb\u0dab\u0dba \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0da7 \u0dc4\u0ddd \u0d85\u0dbd\u0dd4\u0dad\u0dca \u0d92\u0dc0\u0dcf \u0dc3\u0dd1\u0daf\u0dd3\u0db8\u0da7 \u0dc4\u0dd0\u0d9a\u0dd2\u0dba."},"extdesc":{"message":"\u0d94\u0db6\u0d9c\u0dda \u0dbd\u0dda\u0d9b\u0db1, \u0db4\u0dd0\u0dad\u0dd4\u0dbb\u0dd4\u0db8\u0dca\u0db4\u0dad\u0dca \u0dc3\u0dc4 \u0d89\u0daf\u0dd2\u0dbb\u0dd2\u0db4\u0dad\u0dca \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0dca \u0dc3\u0d82\u0dc3\u0dca\u0d9a\u0dbb\u0dab\u0dba \u0d9a\u0dbb\u0db1\u0dca\u0db1, \u0dc3\u0dcf\u0daf\u0db1\u0dca\u0db1, \u0dc3\u0dc4 \u0db6\u0dbd\u0db1\u0dca\u0db1 - \u0dc3\u0dd2\u0dba\u0dbd\u0dca\u0dbd \u0d85\u0db1\u0dca\u0dad\u0dbb\u0dca\u0da2\u0dcf\u0dbd \u0db4\u0dd2\u0dc0\u0dd2\u0dc3\u0dd4\u0db8\u0d9a\u0dd2\u0db1\u0dca \u0dad\u0ddc\u0dbb\u0dc0."},"extname":{"message":"\u0db1\u0ddc\u0db6\u0dd0\u0db3\u0dd2 Google Docs"},"learnmore":{"message":"\u0dad\u0dc0 \u0daf\u0dd0\u0db1 \u0d9c\u0db1\u0dca\u0db1"},"popuphelptext":{"message":"\u0d85\u0db1\u0dca\u0dad\u0dbb\u0dca\u0da2\u0dcf\u0dbd \u0dc3\u0db8\u0dca\u0db6\u0db1\u0dca\u0db0\u0dad\u0dcf\u0dc0\u0d9a\u0dca \u0dc3\u0dc4\u0dd2\u0dad\u0dc0 \u0dc4\u0ddd \u0dbb\u0dc4\u0dd2\u0dad\u0dc0 \u0dbd\u0dd2\u0dba\u0db1\u0dca\u0db1, \u0dc3\u0d82\u0dc3\u0dca\u0d9a\u0dbb\u0dab\u0dba \u0d9a\u0dbb\u0db1\u0dca\u0db1, \u0dc3\u0dc4 \u0d94\u0db6 \u0d9a\u0ddc\u0dc4\u0dda \u0dc3\u0dd2\u0da7\u0dd2\u0dba\u0dad\u0dca \u0dc3\u0dc4\u0dba\u0ddd\u0d9c\u0dba\u0dd9\u0db1\u0dca \u0d9a\u0da7\u0dba\u0dd4\u0dad\u0dd4 \u0d9a\u0dbb\u0db1\u0dca\u0db1."}} +{"createnew":{"message":"\u0db1\u0dc0 \u0dbd\u0dda\u0d9b\u0db1\u0dba\u0d9a\u0dca \u0dc3\u0dcf\u0daf\u0db1\u0dca\u0db1"},"explanationofflinedisabled":{"message":"\u0d94\u0db6 \u0db1\u0ddc\u0db6\u0dd0\u0db3\u0dd2\u0dba. \u0d85\u0db1\u0dca\u0dad\u0dbb\u0dca\u0da2\u0dcf\u0dbd \u0dc3\u0db8\u0dca\u0db6\u0db1\u0dca\u0db0\u0dad\u0dcf\u0dc0\u0d9a\u0dca \u0db1\u0ddc\u0db8\u0dd0\u0dad\u0dd2\u0dc0 Google Docs \u0db7\u0dcf\u0dc0\u0dd2\u0dad \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0da7, Google Docs \u0db8\u0dd4\u0dbd\u0dca \u0db4\u0dd2\u0da7\u0dd4\u0dc0 \u0db8\u0dad \u0dc3\u0dd0\u0d9a\u0dc3\u0dd3\u0db8\u0dca \u0dc0\u0dd9\u0dad \u0d9c\u0ddc\u0dc3\u0dca \u0d94\u0db6 \u0d8a\u0dc5\u0d9f \u0d85\u0dc0\u0dc3\u0dca\u0dae\u0dcf\u0dc0\u0dda \u0d85\u0db1\u0dca\u0dad\u0dbb\u0dca\u0da2\u0dcf\u0dbd\u0dba\u0da7 \u0dc3\u0db6\u0dd0\u0db3\u0dd2 \u0dc0\u0dd2\u0da7 \u0db1\u0ddc\u0db6\u0dd0\u0db3\u0dd2 \u0dc3\u0db8\u0db8\u0dd4\u0dc4\u0dd4\u0dbb\u0dca\u0dad \u0d9a\u0dd2\u0dbb\u0dd3\u0db8 \u0d9a\u0dca\u200d\u0dbb\u0dd2\u0dba\u0dcf\u0dad\u0dca\u0db8\u0d9a \u0d9a\u0dbb\u0db1\u0dca\u0db1."},"explanationofflineenabled":{"message":"\u0d94\u0db6 \u0db1\u0ddc\u0db6\u0dd0\u0db3\u0dd2\u0dba. \u0db1\u0db8\u0dd4\u0dad\u0dca \u0d94\u0db6\u0da7 \u0dad\u0dc0\u0db8 \u0dbd\u0db6\u0dcf \u0d9c\u0dad \u0dc4\u0dd0\u0d9a\u0dd2 \u0d9c\u0ddc\u0db1\u0dd4 \u0dc3\u0d82\u0dc3\u0dca\u0d9a\u0dbb\u0dab\u0dba \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0da7 \u0dc4\u0ddd \u0d85\u0dbd\u0dd4\u0dad\u0dca \u0d92\u0dc0\u0dcf \u0dc3\u0dd1\u0daf\u0dd3\u0db8\u0da7 \u0dc4\u0dd0\u0d9a\u0dd2\u0dba."},"extdesc":{"message":"\u0d94\u0db6\u0d9c\u0dda \u0dbd\u0dda\u0d9b\u0db1, \u0db4\u0dd0\u0dad\u0dd4\u0dbb\u0dd4\u0db8\u0dca\u0db4\u0dad\u0dca \u0dc3\u0dc4 \u0d89\u0daf\u0dd2\u0dbb\u0dd2\u0db4\u0dad\u0dca \u0d9a\u0dd2\u0dbb\u0dd3\u0db8\u0dca \u0dc3\u0d82\u0dc3\u0dca\u0d9a\u0dbb\u0dab\u0dba \u0d9a\u0dbb\u0db1\u0dca\u0db1, \u0dc3\u0dcf\u0daf\u0db1\u0dca\u0db1, \u0dc3\u0dc4 \u0db6\u0dbd\u0db1\u0dca\u0db1 - \u0dc3\u0dd2\u0dba\u0dbd\u0dca\u0dbd \u0d85\u0db1\u0dca\u0dad\u0dbb\u0dca\u0da2\u0dcf\u0dbd \u0db4\u0dd2\u0dc0\u0dd2\u0dc3\u0dd4\u0db8\u0d9a\u0dd2\u0db1\u0dca \u0dad\u0ddc\u0dbb\u0dc0."},"extname":{"message":"\u0db1\u0ddc\u0db6\u0dd0\u0db3\u0dd2 Google Docs"},"learnmore":{"message":"\u0dad\u0dc0 \u0daf\u0dd0\u0db1 \u0d9c\u0db1\u0dca\u0db1"},"popuphelptext":{"message":"\u0d85\u0db1\u0dca\u0dad\u0dbb\u0dca\u0da2\u0dcf\u0dbd \u0dc3\u0db8\u0dca\u0db6\u0db1\u0dca\u0db0\u0dad\u0dcf\u0dc0\u0d9a\u0dca \u0dc3\u0dc4\u0dd2\u0dad\u0dc0 \u0dc4\u0ddd \u0dbb\u0dc4\u0dd2\u0dad\u0dc0 \u0dbd\u0dd2\u0dba\u0db1\u0dca\u0db1, \u0dc3\u0d82\u0dc3\u0dca\u0d9a\u0dbb\u0dab\u0dba \u0d9a\u0dbb\u0db1\u0dca\u0db1, \u0dc3\u0dc4 \u0d94\u0db6 \u0d9a\u0ddc\u0dc4\u0dda \u0dc3\u0dd2\u0da7\u0dd2\u0dba\u0dad\u0dca \u0dc3\u0dc4\u0dba\u0ddd\u0d9c\u0dba\u0dd9\u0db1\u0dca \u0d9a\u0da7\u0dba\u0dd4\u0dad\u0dd4 \u0d9a\u0dbb\u0db1\u0dca\u0db1."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zh_HK/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zh_HK/messages.json index b1d5848..b3dfa9d 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zh_HK/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zh_HK/messages.json @@ -1 +1 @@ -{"createnew":{"message":"\u5efa\u7acb\u65b0\u9805\u76ee"},"explanationofflinedisabled":{"message":"\u60a8\u8655\u65bc\u96e2\u7dda\u72c0\u614b\u3002\u5982\u8981\u5728\u6c92\u6709\u4e92\u806f\u7db2\u9023\u7dda\u7684\u60c5\u6cc1\u4e0b\u4f7f\u7528\u300cGoogle \u6587\u4ef6\u300d\uff0c\u8acb\u524d\u5f80\u300cGoogle \u6587\u4ef6\u300d\u9996\u9801\u7684\u8a2d\u5b9a\uff0c\u4e26\u5728\u4e0b\u6b21\u9023\u63a5\u4e92\u806f\u7db2\u6642\u958b\u555f\u96e2\u7dda\u540c\u6b65\u529f\u80fd\u3002"},"explanationofflineenabled":{"message":"\u60a8\u8655\u65bc\u96e2\u7dda\u72c0\u614b\uff0c\u4f46\u60a8\u4ecd\u53ef\u4ee5\u7de8\u8f2f\u53ef\u7528\u6a94\u6848\u6216\u5efa\u7acb\u65b0\u6a94\u6848\u3002"},"extdesc":{"message":"\u7de8\u8f2f\u3001\u5efa\u7acb\u53ca\u67e5\u770b\u60a8\u7684\u6587\u4ef6\u3001\u8a66\u7b97\u8868\u548c\u7c21\u5831\uff0c\u5b8c\u5168\u4e0d\u9700\u4f7f\u7528\u4e92\u806f\u7db2\u3002"},"extname":{"message":"\u300cGoogle \u6587\u4ef6\u300d\u96e2\u7dda\u7248"},"learnmore":{"message":"\u77ad\u89e3\u8a73\u60c5"},"popuphelptext":{"message":"\u7121\u8ad6\u662f\u5426\u9023\u63a5\u4e92\u806f\u7db2\uff0c\u90fd\u80fd\u64b0\u5beb\u3001\u7de8\u8f2f\u5167\u5bb9\u4ee5\u53ca\u8207\u4ed6\u4eba\u5354\u4f5c\u3002"}} +{"createnew":{"message":"\u5efa\u7acb\u65b0\u9805\u76ee"},"explanationofflinedisabled":{"message":"\u60a8\u8655\u65bc\u96e2\u7dda\u72c0\u614b\u3002\u5982\u8981\u5728\u6c92\u6709\u4e92\u806f\u7db2\u9023\u7dda\u7684\u60c5\u6cc1\u4e0b\u4f7f\u7528\u300cGoogle \u6587\u4ef6\u300d\uff0c\u8acb\u524d\u5f80\u300cGoogle \u6587\u4ef6\u300d\u9996\u9801\u7684\u8a2d\u5b9a\uff0c\u4e26\u5728\u4e0b\u6b21\u9023\u63a5\u4e92\u806f\u7db2\u6642\u958b\u555f\u96e2\u7dda\u540c\u6b65\u529f\u80fd\u3002"},"explanationofflineenabled":{"message":"\u60a8\u8655\u65bc\u96e2\u7dda\u72c0\u614b\uff0c\u4f46\u60a8\u4ecd\u53ef\u4ee5\u7de8\u8f2f\u53ef\u7528\u6a94\u6848\u6216\u5efa\u7acb\u65b0\u6a94\u6848\u3002"},"extdesc":{"message":"\u7de8\u8f2f\u3001\u5efa\u7acb\u53ca\u67e5\u770b\u60a8\u7684\u6587\u4ef6\u3001\u8a66\u7b97\u8868\u548c\u7c21\u5831\uff0c\u5b8c\u5168\u4e0d\u9700\u4f7f\u7528\u4e92\u806f\u7db2\u3002"},"extname":{"message":"\u300cGoogle \u6587\u4ef6\u300d\u96e2\u7dda\u7248"},"learnmore":{"message":"\u77ad\u89e3\u8a73\u60c5"},"popuphelptext":{"message":"\u7121\u8ad6\u662f\u5426\u9023\u63a5\u4e92\u806f\u7db2\uff0c\u90fd\u80fd\u64b0\u5beb\u3001\u7de8\u8f2f\u5167\u5bb9\u4ee5\u53ca\u8207\u4ed6\u4eba\u5354\u4f5c\u3002"}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zu/messages.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zu/messages.json index 7e16a51..2f21ac7 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zu/messages.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/_locales/zu/messages.json @@ -1 +1 @@ -{"createnew":{"message":"DALA ENTSHA"},"explanationofflinedisabled":{"message":"Awuxhunyiwe ku-inthanethi. Ukuze usebenzise i-Google Amadokhumenti ngaphandle koxhumano lwe-inthanethi, iya kokuthi izilungiselelo ekhasini lasekhaya le-Google Amadokhumenti bese uvula ukuvumelanisa okungaxhunyiwe ku-inthanethi ngesikhathi esilandelayo lapho uxhunywe ku-inthanethi."},"explanationofflineenabled":{"message":"Awuxhunyiwe ku-inthanethi, kodwa usangakwazi ukuhlela amafayela atholakalayo noma udale amasha."},"extdesc":{"message":"Hlela, dala, futhi ubuke amadokhumenti akho, amaspredishithi, namaphrezentheshini \u2014 konke ngaphandle kokufinyelela kwe-inthanethi."},"extname":{"message":"I-Google Amadokhumenti engaxhumekile ku-intanethi"},"learnmore":{"message":"Funda kabanzi"},"popuphelptext":{"message":"Bhala, hlela, futhi hlanganyela noma yikuphi lapho okhona, unalo noma ungenalo uxhumano lwe-inthanethi."}} +{"createnew":{"message":"DALA ENTSHA"},"explanationofflinedisabled":{"message":"Awuxhunyiwe ku-inthanethi. Ukuze usebenzise i-Google Amadokhumenti ngaphandle koxhumano lwe-inthanethi, iya kokuthi izilungiselelo ekhasini lasekhaya le-Google Amadokhumenti bese uvula ukuvumelanisa okungaxhunyiwe ku-inthanethi ngesikhathi esilandelayo lapho uxhunywe ku-inthanethi."},"explanationofflineenabled":{"message":"Awuxhunyiwe ku-inthanethi, kodwa usangakwazi ukuhlela amafayela atholakalayo noma udale amasha."},"extdesc":{"message":"Hlela, dala, futhi ubuke amadokhumenti akho, amaspredishithi, namaphrezentheshini \u2014 konke ngaphandle kokufinyelela kwe-inthanethi."},"extname":{"message":"I-Google Amadokhumenti engaxhumekile ku-intanethi"},"learnmore":{"message":"Funda kabanzi"},"popuphelptext":{"message":"Bhala, hlela, futhi hlanganyela noma yikuphi lapho okhona, unalo noma ungenalo uxhumano lwe-inthanethi."}} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/dasherSettingSchema.json b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/dasherSettingSchema.json index 900d263..f7c7a28 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/dasherSettingSchema.json +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/dasherSettingSchema.json @@ -1,21 +1,21 @@ -{ - "type": "object", - "properties": { - "allowedDocsOfflineDomains": { - "type": "array", - "items": { - "type": "string" - }, - "title": "Allow users to enable Docs offline for the specified managed domains.", - "description": "Users on managed devices will be able to enable docs offline if they are part of the specified managed domains." - }, - "autoEnabledDocsOfflineDomains": { - "type": "array", - "items": { - "type": "string" - }, - "title": "Auto enable Docs offline for the specified managed domains in certain eligible situations.", - "description": "Users on managed devices, in certain eligible situations, will be able to automatically access and edit recent files offline for the managed domains set in this property. They can still disable it from Drive settings." - } - } -} +{ + "type": "object", + "properties": { + "allowedDocsOfflineDomains": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Allow users to enable Docs offline for the specified managed domains.", + "description": "Users on managed devices will be able to enable docs offline if they are part of the specified managed domains." + }, + "autoEnabledDocsOfflineDomains": { + "type": "array", + "items": { + "type": "string" + }, + "title": "Auto enable Docs offline for the specified managed domains in certain eligible situations.", + "description": "Users on managed devices, in certain eligible situations, will be able to automatically access and edit recent files offline for the managed domains set in this property. They can still disable it from Drive settings." + } + } +} diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/offscreendocument.html b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/offscreendocument.html index 8658fdf..2da7071 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/offscreendocument.html +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/offscreendocument.html @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/offscreendocument_main.js b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/offscreendocument_main.js index 4463ef2..c145fb5 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/offscreendocument_main.js +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/offscreendocument_main.js @@ -1,218 +1,218 @@ -'use strict';function aa(){return function(a){return a}}function n(){return function(){}}function ba(a){return function(){return this[a]}}function ca(a){return function(){return a}}var p,da=typeof Object.create=="function"?Object.create:function(a){function b(){}b.prototype=a;return new b},ea=typeof Object.defineProperties=="function"?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a}; -function fa(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b>>0)+"_",e=0;return b}); -q("Symbol.iterator",function(a){if(a)return a;a=Symbol("Symbol.iterator");ea(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return qa(oa(this))}});return a});function qa(a){a={next:a};a[Symbol.iterator]=function(){return this};return a} -q("Promise",function(a){function b(g){this.g=0;this.l=void 0;this.j=[];this.J=!1;var h=this.o();try{g(h.resolve,h.reject)}catch(k){h.reject(k)}}function c(){this.g=null}function d(g){return g instanceof b?g:new b(function(h){h(g)})}if(a)return a;c.prototype.j=function(g){if(this.g==null){this.g=[];var h=this;this.l(function(){h.v()})}this.g.push(g)};var e=ha.setTimeout;c.prototype.l=function(g){e(g,0)};c.prototype.v=function(){for(;this.g&&this.g.length;){var g=this.g;this.g=[];for(var h=0;h=f}}); -function ua(a,b){a instanceof String&&(a+="");var c=0,d=!1,e={next:function(){if(!d&&c>>16&65535)*e+d*(c>>>16&65535)<<16>>>0)|0}}); -q("String.prototype.repeat",function(a){return a?a:function(b){var c=ta(this,null,"repeat");if(b<0||b>1342177279)throw new RangeError("Invalid count value");b|=0;for(var d="";b;)if(b&1&&(d+=c),b>>>=1)c+=c;return d}}); -q("String.prototype.matchAll",function(a){return a?a:function(b){if(b instanceof RegExp&&!b.global)throw new TypeError("RegExp passed into String.prototype.matchAll() must have global tag.");var c=new RegExp(b,b instanceof RegExp?void 0:"g"),d=this,e=!1,f={next:function(){if(e)return{value:void 0,done:!0};var g=c.exec(d);if(!g)return e=!0,{value:void 0,done:!0};g[0]===""&&(c.lastIndex+=1);return{value:g,done:!1}}};f[Symbol.iterator]=function(){return f};return f}}); -q("Promise.prototype.finally",function(a){return a?a:function(b){return this.then(function(c){return Promise.resolve(b()).then(function(){return c})},function(c){return Promise.resolve(b()).then(function(){throw c;})})}});/* - - Copyright The Closure Library Authors. - SPDX-License-Identifier: Apache-2.0 -*/ -var va=va||{},w=this||self;function wa(a,b){var c=xa("CLOSURE_FLAGS");a=c&&c[a];return a!=null?a:b}function xa(a){a=a.split(".");for(var b=w,c=0;c>>0),Ca=0; -function Da(a,b,c){return a.call.apply(a.bind,arguments)}function Ea(a,b,c){if(!a)throw Error();if(arguments.length>2){var d=Array.prototype.slice.call(arguments,2);return function(){var e=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(e,d);return a.apply(b,e)}}return function(){return a.apply(b,arguments)}}function x(a,b,c){x=Function.prototype.bind&&Function.prototype.bind.toString().indexOf("native code")!=-1?Da:Ea;return x.apply(null,arguments)} -function Fa(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function Ga(a){(0,eval)(a)}function Ha(a){return a}function z(a,b){function c(){}c.prototype=b.prototype;a.T=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.cc=function(d,e,f){for(var g=Array(arguments.length-2),h=2;h0:!1};function Ra(a,b){return Array.prototype.some.call(a,b,void 0)}function Sa(a,b){b=Array.prototype.indexOf.call(a,b,void 0);var c;(c=b>=0)&&Array.prototype.splice.call(a,b,1);return c}function Ta(a,b){for(var c=1;c=b||(d[a]=c+1,a=Error(),eb(a,"severity","incident"),Ia(a))}};function ib(){return typeof BigInt==="function"};var jb=typeof Symbol==="function"&&typeof Symbol()==="symbol";function kb(a,b,c){return typeof Symbol==="function"&&typeof Symbol()==="symbol"?(c===void 0?0:c)&&Symbol.for&&a?Symbol.for(a):a!=null?Symbol(a):Symbol():b}var lb=kb("jas",void 0,!0),mb=kb(void 0,"0di"),nb=kb(void 0,"1oa"),ob=kb(void 0,Symbol()),pb=kb(void 0,"0ubs"),qb=kb(void 0,"0actk"),rb=kb("m_m","fc",!0);Math.max.apply(Math,pa(Object.values({Gb:1,Eb:2,Bb:4,Pb:8,Yb:16,Lb:32,nb:64,zb:128,xb:256,Vb:512,yb:1024,Ab:2048,Mb:4096,Hb:8192})));var sb={bb:{value:0,configurable:!0,writable:!0,enumerable:!1}},tb=Object.defineProperties,C=jb?lb:"bb",ub,vb=[];D(vb,7);ub=Object.freeze(vb);function wb(a,b){jb||C in a||tb(a,sb);a[C]|=b}function D(a,b){jb||C in a||tb(a,sb);a[C]=b}function xb(a){wb(a,34);return a};var yb={};function zb(a,b){return b===void 0?a.g!==Ab&&!!(2&(a.C[C]|0)):!!(2&b)&&a.g!==Ab}var Ab={},Bb=Object.freeze({});function Cb(a){a.ec=!0;return a};var Db=Cb(function(a){return typeof a==="number"}),Eb=Cb(function(a){return typeof a==="string"}),Fb=Cb(function(a){return typeof a==="boolean"}),Gb=Cb(function(a){return typeof a==="bigint"});var Hb=typeof w.BigInt==="function"&&typeof w.BigInt(0)==="bigint";function Ib(a){var b=a;if(Eb(b)){if(!/^\s*(?:-?[1-9]\d*|0)?\s*$/.test(b))throw Error(String(b));}else if(Db(b)&&!Number.isSafeInteger(b))throw Error(String(b));return Hb?BigInt(a):a=Fb(a)?a?"1":"0":Eb(a)?a.trim()||"0":String(a)} -var Jb=Cb(function(a){return Hb?Gb(a):Eb(a)&&/^(?:-?[1-9]\d*|0)$/.test(a)}),Pb=Cb(function(a){return Hb?a>=Kb&&a<=Lb:a[0]==="-"?Mb(a,Nb):Mb(a,Ob)}),Nb=Number.MIN_SAFE_INTEGER.toString(),Kb=Hb?BigInt(Number.MIN_SAFE_INTEGER):void 0,Ob=Number.MAX_SAFE_INTEGER.toString(),Lb=Hb?BigInt(Number.MAX_SAFE_INTEGER):void 0;function Mb(a,b){if(a.length>b.length)return!1;if(a.lengthe)return!1;if(d>>0;E=b;F=(a-b)/4294967296>>>0}function Rb(a){if(a<0){Qb(0-a);var b=v(Sb(E,F));a=b.next().value;b=b.next().value;E=a>>>0;F=b>>>0}else Qb(a)}function Tb(a,b){b>>>=0;a>>>=0;if(b<=2097151)var c=""+(4294967296*b+a);else ib()?c=""+(BigInt(b)<>>24|b<<8)&16777215,b=b>>16&65535,a=(a&16777215)+c*6777216+b*6710656,c+=b*8147497,b*=2,a>=1E7&&(c+=a/1E7>>>0,a%=1E7),c>=1E7&&(b+=c/1E7>>>0,c%=1E7),c=b+Ub(c)+Ub(a));return c} -function Ub(a){a=String(a);return"0000000".slice(a.length)+a}function Vb(){var a=E,b=F;b&2147483648?ib()?a=""+(BigInt(b|0)<>>0)):(b=v(Sb(a,b)),a=b.next().value,b=b.next().value,a="-"+Tb(a,b)):a=Tb(a,b);return a}function Sb(a,b){b=~b;a?a=~a+1:b+=1;return[a,b]};var Wb=typeof BigInt==="function"?BigInt.asIntN:void 0,Xb=Number.isSafeInteger,Yb=Number.isFinite,Zb=Math.trunc;function $b(a){if(a==null||typeof a==="number")return a;if(a==="NaN"||a==="Infinity"||a==="-Infinity")return Number(a)}function ac(a){return a.displayName||a.name||"unknown type name"}var bc=/^-?([1-9][0-9]*|0)(\.[0-9]+)?$/;function cc(a){switch(typeof a){case "bigint":return!0;case "number":return Yb(a);case "string":return bc.test(a);default:return!1}} -function dc(a){if(!Yb(a))throw a=Error("enum"),eb(a,"severity","warning"),a;return a|0}function ec(a){return a==null?a:Yb(a)?a|0:void 0}function fc(a){if(a==null)return a;if(typeof a==="string"&&a)a=+a;else if(typeof a!=="number")return;return Yb(a)?a|0:void 0} -function hc(a){var b=a.length;if(a[0]==="-"?b<20||b===20&&a<="-9223372036854775808":b<19||b===19&&a<="9223372036854775807")return a;if(a.length<16)Rb(Number(a));else if(ib())a=BigInt(a),E=Number(a&BigInt(4294967295))>>>0,F=Number(a>>BigInt(32)&BigInt(4294967295));else{b=+(a[0]==="-");F=E=0;for(var c=a.length,d=0+b,e=(c-b)%6+b;e<=c;d=e,e+=6)d=Number(a.slice(d,e)),F*=1E6,E=E*1E6+d,E>=4294967296&&(F+=Math.trunc(E/4294967296),F>>>=0,E>>>=0);b&&(b=v(Sb(E,F)),a=b.next().value,b=b.next().value,E=a,F=b)}return Vb()} -function ic(a){cc(a);a=Zb(a);if(!Xb(a)){Rb(a);var b=E,c=F;if(a=c&2147483648)b=~b+1>>>0,c=~c>>>0,b==0&&(c=c+1>>>0);var d=c*4294967296+(b>>>0);b=Number.isSafeInteger(d)?d:Tb(b,c);a=typeof b==="number"?a?-b:b:a?"-"+b:b}return a}function jc(a){cc(a);a=Zb(a);Xb(a)?a=String(a):(Rb(a),a=Vb());return a} -function kc(a,b){b=b===void 0?!1:b;var c=typeof a;if(a==null)return a;if(c==="bigint")return String(Wb(64,a));if(cc(a))return c==="string"?(cc(a),b=Zb(Number(a)),Xb(b)?a=String(b):(b=a.indexOf("."),b!==-1&&(a=a.substring(0,b)),a=hc(a))):a=b?jc(a):ic(a),a} -function lc(a){var b=typeof a;if(a==null)return a;if(b==="bigint")return Ib(Wb(64,a));if(cc(a))return b==="string"?(b=Zb(Number(a)),Xb(b)?a=Ib(b):(b=a.indexOf("."),b!==-1&&(a=a.substring(0,b)),a=ib()?Ib(Wb(64,BigInt(a))):Ib(hc(a)))):a=Xb(a)?Ib(ic(a)):Ib(jc(a)),a}function mc(a){return a==null||typeof a==="string"?a:void 0}function nc(a,b,c,d){if(a!=null&&a[rb]===yb)return a;if(!Array.isArray(a))return c?d&2?b[mb]||(b[mb]=oc(b)):new b:void 0;c=a[C]|0;d=c|d&32|d&2;d!==c&&D(a,d);return new b(a)} -function oc(a){a=new a;xb(a.C);return a};function pc(a){return a};function qc(){}function rc(a,b){for(var c in a)!isNaN(c)&&b(a,+c,a[c])}function sc(a){var b=new qc;rc(a,function(c,d,e){b[d]=Array.prototype.slice.call(e)});b.g=a.g;return b}function tc(a,b){b<100||hb(pb,1)};function uc(a,b,c,d){var e=d!==void 0;d=!!d;var f=Ha(ob),g;!e&&jb&&f&&(g=a[f])&&rc(g,tc);f=[];var h=a.length;g=4294967295;var k=!1,l=!!(b&64),m=l?b&128?0:-1:void 0;if(!(b&1)){var t=h&&a[h-1];t!=null&&typeof t==="object"&&t.constructor===Object?(h--,g=h):t=void 0;if(l&&!(b&128)&&!e){k=!0;var r;g=((r=vc)!=null?r:pc)(g-m,m,a,t,void 0)+m}}b=void 0;for(r=0;r=g){var I=r-m,N=void 0;((N=b)!=null?N:b={})[I]=y}else f[r]=y}if(t)for(var ja in t)h=t[ja], -h!=null&&(h=c(h,d))!=null&&(r=+ja,y=void 0,l&&!Number.isNaN(r)&&(y=r+m)>2];l=c[(l&3)<<4|m>>4];m=c[(m&15)<<2|k>>6];k=c[k&63];d[f++]=""+h+l+m+k}h=0;k=e;switch(b.length-g){case 2:h= -b[g+1],k=c[(h&15)<<2]||e;case 1:b=b[g],d[f]=""+c[b>>2]+c[(b&3)<<4|h>>4]+k+e}b=d.join("")}a=a.g=b}return a}return}return a}var yc=ab?structuredClone:function(a){return uc(a,0,wc)},vc;function xc(a){a=a.C;return uc(a,a[C]|0,wc)};function G(a,b,c,d){d=d===void 0?0:d;if(a==null){var e=32;c?(a=[c],e|=128):a=[];b&&(e=e&-16760833|(b&1023)<<14)}else{if(!Array.isArray(a))throw Error("narr");e=a[C]|0;if(La&&1&e)throw Error("rfarr");2048&e&&!(2&e)&&zc();if(e&256)throw Error("farr");if(e&64)return(e|d)!==e&&D(a,e|d),a;if(c&&(e|=128,c!==a[0]))throw Error("mid");a:{c=a;e|=64;var f=c.length;if(f){var g=f-1,h=c[g];if(h!=null&&typeof h==="object"&&h.constructor===Object){b=e&128?0:-1;g-=b;if(g>=1024)throw Error("pvtlmt");for(var k in h)f= -+k,f1024)throw Error("spvt");e=e&-16760833|(k&1023)<<14}}}D(a,e|64|d);return a}function zc(){if(La)throw Error("carr");hb(qb,5)};function Ac(a,b){if(typeof a!=="object")return a;if(Array.isArray(a)){var c=a[C]|0;a.length===0&&c&1?a=void 0:c&2||(!b||4096&c||16&c?a=Bc(a,c,!1,b&&!(c&16)):(wb(a,34),c&4&&Object.freeze(a)));return a}if(a!=null&&a[rb]===yb)return b=a.C,c=b[C]|0,zb(a,c)?a:Cc(a,b,c)?Dc(a,b):Bc(b,c);if(a instanceof bb)return a}function Dc(a,b,c){a=new a.constructor(b);c&&(a.g=Ab);a.j=Ab;return a}function Bc(a,b,c,d){d!=null||(d=!!(34&b));a=uc(a,b,Ac,d);d=32;c&&(d|=2);b=b&16769217|d;D(a,b);return a} -function Ec(a){var b=a.C,c=b[C]|0;return zb(a,c)?Cc(a,b,c)?Dc(a,b,!0):new a.constructor(Bc(b,c,!1)):a}function Fc(a){if(a.g!==Ab)return!1;var b=a.C;b=Bc(b,b[C]|0);wb(b,2048);a.C=b;a.g=void 0;a.j=void 0;return!0}function Gc(a,b){b===void 0&&(b=a[C]|0);b&32&&!(b&4096)&&D(a,b|4096)}function Cc(a,b,c){return c&2?!0:c&32&&!(c&4096)?(D(b,c|2),a.g=Ab,!0):!1};var Hc=Ib(0),Ic={};function H(a,b,c,d,e){Object.isExtensible(a);b=Jc(a.C,b,c,e);if(b!==null||d&&a.j!==Ab)return b}function Jc(a,b,c,d){if(b===-1)return null;var e=b+(c?0:-1),f=a.length-1;if(!(f<1+(c?0:-1))){if(e>=f){var g=a[f];if(g!=null&&typeof g==="object"&&g.constructor===Object){c=g[b];var h=!0}else if(e===f)c=g;else return}else c=a[e];if(d&&c!=null){d=d(c);if(d==null)return d;if(!Object.is(d,c))return h?g[b]=d:a[e]=d,d}return c}} -function Kc(a,b,c){if(!Fc(a)&&zb(a,a.C[C]|0))throw Error();var d=a.C;Lc(d,d[C]|0,b,c);return a}function Lc(a,b,c,d){var e=c+-1,f=a.length-1;if(f>=0&&e>=f){var g=a[f];if(g!=null&&typeof g==="object"&&g.constructor===Object)return g[c]=d,b}if(e<=f)return a[e]=d,b;if(d!==void 0){var h;f=((h=b)!=null?h:b=a[C]|0)>>14&1023||536870912;c>=f?d!=null&&(e={},a[f+-1]=(e[c]=d,e)):a[e]=d}return b} -function Mc(a,b,c,d,e,f,g,h){var k=b;f===1||(f!==4?0:2&b||!(16&b)&&32&d)?Nc(b)||(b|=!a.length||g&&!(4096&b)||32&d&&!(4096&b||16&b)?2:256,b!==k&&D(a,b),Object.freeze(a)):(f===2&&Nc(b)&&(a=Array.prototype.slice.call(a),k=0,b=Oc(b,d),d=Lc(c,d,e,a)),Nc(b)||(h||(b|=16),b!==k&&D(a,b)));2&b||!(4096&b||16&b)||Gc(c,d);return a}function Pc(a,b){a=Jc(a,b);return Array.isArray(a)?a:ub}function Qc(a,b){2&b&&(a|=2);return a|1}function Nc(a){return!!(2&a)&&!!(4&a)||!!(256&a)} -function Rc(a){return a==null?a:typeof a==="string"?a?new bb(a,$a):cb():a.constructor===bb?a:Ya&&a!=null&&a instanceof Uint8Array?a.length?new bb(new Uint8Array(a),$a):cb():void 0}function Sc(a,b,c){return Tc(a,b)===c?c:-1} -function Tc(a,b){a=a.C;if(jb){var c;var d=(c=a[nb])!=null?c:a[nb]=new Map}else nb in a?d=a[nb]:(c=new Map,Object.defineProperty(a,nb,{value:c}),d=c);c=d;d=void 0;var e=c.get(b);if(e==null){for(var f=e=0;f>>0)}p=ud.prototype;p.isSafeInteger=function(){var a=this.F>>21;return a==0||a==-1&&!(this.I==0&&this.F==-2097152)}; -p.toString=function(a){a=a||10;if(a<2||36>2);var c=Math.pow(a,b),d=K(c,c/4294967296);c=this.div(d);var e=Math,f=e.abs;d=c.multiply(d);d=this.add(wd(d));e=f.call(e,vd(d));f=a==10?""+e:e.toString(a);f.length>>0>a.I>>>0?1:-1:this.F>a.F?1:-1};function wd(a){var b=~a.I+1|0;return K(b,~a.F+!b|0)}p.add=function(a){var b=this.F>>>16,c=this.F&65535,d=this.I>>>16,e=a.F>>>16,f=a.F&65535,g=a.I>>>16;a=(this.I&65535)+(a.I&65535);g=(a>>>16)+(d+g);d=g>>>16;d+=c+f;return K((g&65535)<<16|a&65535,((d>>>16)+(b+e)&65535)<<16|d&65535)}; -p.multiply=function(a){if(xd(this))return this;if(xd(a))return a;var b=this.F>>>16,c=this.F&65535,d=this.I>>>16,e=this.I&65535,f=a.F>>>16,g=a.F&65535,h=a.I>>>16;a=a.I&65535;var k=e*a;var l=(k>>>16)+d*a;var m=l>>>16;l=(l&65535)+e*h;m+=l>>>16;m+=c*a;var t=m>>>16;m=(m&65535)+d*h;t+=m>>>16;m=(m&65535)+e*g;t=t+(m>>>16)+(b*a+c*h+d*g+e*f)&65535;return K((l&65535)<<16|k&65535,t<<16|m&65535)}; -p.div=function(a){if(xd(a))throw Error("division by zero");if(this.F<0){if(this.equals(yd)){if(a.equals(zd)||a.equals(Ad))return yd;if(a.equals(yd))return zd;var b=this.F;b=K(this.I>>>1|b<<31,b>>1);b=b.div(a).shiftLeft(1);if(b.equals(Bd))return a.F<0?zd:Ad;var c=a.multiply(b);c=this.add(wd(c));return b.add(c.div(a))}return a.F<0?wd(this).div(wd(a)):wd(wd(this).div(a))}if(xd(this))return Bd;if(a.F<0)return a.equals(yd)?Bd:wd(this.div(wd(a)));b=Bd;for(c=this;c.compare(a)>=0;){var d=Math.max(1,Math.floor(vd(c)/ -vd(a))),e=Math.ceil(Math.log(d)/Math.LN2);e=e<=48?1:Math.pow(2,e-48);for(var f=Cd(d),g=f.multiply(a);g.F<0||g.compare(c)>0;)d-=e,f=Cd(d),g=f.multiply(a);xd(f)&&(f=zd);b=b.add(f);c=c.add(wd(g))}return b};p.and=function(a){return K(this.I&a.I,this.F&a.F)};p.or=function(a){return K(this.I|a.I,this.F|a.F)};p.xor=function(a){return K(this.I^a.I,this.F^a.F)};p.shiftLeft=function(a){a&=63;if(a==0)return this;var b=this.I;return a<32?K(b<>>32-a):K(0,b<0?a>=0x7fffffffffffffff?Dd:new ud(a,a/4294967296):a<0?a<=-0x7fffffffffffffff?yd:wd(new ud(-a,-a/4294967296)):Bd}function K(a,b){return new ud(a,b)}var Bd=K(0,0),zd=K(1,0),Ad=K(-1,-1),Dd=K(4294967295,2147483647),yd=K(0,2147483648);function Ed(a,b){b=b===void 0?window:b;b=b===void 0?window:b;return(b=b.WIZ_global_data)&&a in b?b[a]:null};var Fd; -function Gd(){var a=null;var b=Ed("TSDtV",window);if(b=typeof b!=="string"?null:b)a=td("["+b.substring(4)),a=Xc(a,rd,1)[0];if(a){b=v(Xc(a,pd,2));for(var c=b.next();!c.done;c=b.next()){c=c.value;var d=c.C;if(Uc(d,d[C]|0,id,Sc(c,qd,6))!==void 0)throw Error();}}if(a)for(b={},c=v(Xc(a,pd,2)),d=c.next();!d.done;d=c.next()){var e=d.value;d=ad(e,1).toString();switch(Tc(e,qd)){case 3:b[d]=Zc(e,Sc(e,qd,3));break;case 2:var f=ad(e,Sc(e,qd,2));Jb(f);Pb(f);f=Pb(f)?Number(f):String(f);b[d]=f;break;case 4:f=void 0; -var g=e;var h=Sc(e,qd,4);e=void 0;e=e===void 0?0:e;g=(f=H(g,h,void 0,void 0,$b))!=null?f:e;b[d]=g;break;case 5:b[d]=bd(e,Sc(e,qd,5));break;case 6:b[d]=Wc(e,id,Sc(e,qd,6));break;case 8:f=Vc(e,nd,Sc(e,qd,8));switch(Tc(f,od)){case 1:b[d]=bd(f,Sc(f,od,1));break;default:throw Error("case "+Tc(f,od));}break;default:throw Error("case "+Tc(e,qd));}}else b={};this.g=b;this.j=a?a.za():null}Gd.prototype.za=ba("j");function Jd(a){this.C=G(a,void 0,void 0,2048)}u(Jd,J);var Kd=new kd;function Ld(a){this.C=G(a,void 0,void 0,2048)}u(Ld,J);var Md=function(a){return function(){return a[mb]||(a[mb]=oc(a))}}(Ld);Object.create(null);function L(){}L.prototype.equals=function(a){return Nd(this,a)};L.prototype.ra=function(){return this.v||(Object.defineProperties(this,{v:{value:Od=Od+1|0,enumerable:!1}}),this.v)};L.prototype.toString=function(){return M(Pd(O(Qd(this))))+"@"+M((this.ra()>>>0).toString(16))};L.prototype.B=["java.lang.Object",0];function Rd(){}u(Rd,L);function P(a,b){a.g=b;Sd(b,a)}function Q(a){Td(a.g)&&(Error.captureStackTrace?Error.captureStackTrace(R(a.g,Td,Ud)):R(a.g,Td,Ud).stack=Error().stack)}Rd.prototype.toString=function(){var a=Pd(O(Qd(this))),b=this.j;return b==null?a:M(a)+": "+M(b)};function Vd(a){if(a!=null){var b=a.La;if(b!=null)return b}a instanceof TypeError?b=Wd():(b=new Xd,Q(b),P(b,Error(b)));b.j=a==null?"null":a.toString();P(b,a);return b}function Yd(a){return a instanceof Rd} -Rd.prototype.B=["java.lang.Throwable",0];function Zd(){}u(Zd,Rd);Zd.prototype.B=["java.lang.Exception",0];function S(){}u(S,Zd);S.prototype.B=["java.lang.RuntimeException",0];function $d(){}u($d,S);$d.prototype.B=["java.lang.IndexOutOfBoundsException",0];var ae;function be(){be=n();for(var a=ce(),b=0;b<256;b=b+1|0)de(a,b,ee(b-128|0));ae=a};function fe(){}u(fe,S);fe.prototype.B=["java.lang.ArithmeticException",0];function ge(){}u(ge,S);ge.prototype.B=["java.lang.ArrayStoreException",0];function he(){}u(he,S);he.prototype.B=["java.lang.ClassCastException",0];function ie(){}u(ie,S);ie.prototype.B=["java.lang.IllegalArgumentException",0];function je(){}u(je,S);function ke(a){var b=new je;b.j=a;Q(b);P(b,Error(b));return b}je.prototype.B=["java.lang.IllegalStateException",0];function Xd(){}u(Xd,S);Xd.prototype.B=["java.lang.JsException",0];function le(){}u(le,Xd);function Wd(){var a=new le;Q(a);P(a,new TypeError(a));return a}le.prototype.B=["java.lang.NullPointerException",0];function me(){}u(me,$d);me.prototype.B=["java.lang.StringIndexOutOfBoundsException",0];function ne(){}var oe;u(ne,L);ne.prototype.B=["java.lang.Number",0];function pe(){}u(pe,ne);pe.prototype.B=["java.lang.Double",0];function qe(a){return Cd(a)}function re(a){if(!isFinite(a))throw a=new fe,Q(a),P(a,Error(a)),a.g;return a|0};function se(){}u(se,L);se.prototype.B=["java.lang.Boolean",0];function R(a,b,c){if(a!=null&&!b(a))throw a=M(Pd(te(a)))+" cannot be cast to "+M(Pd(O(c))),b=new he,b.j=a,Q(b),P(b,Error(b)),b.g;return a};function Qd(a){return a.constructor}function ue(a,b,c){if(Object.prototype.hasOwnProperty.call(a.prototype,b))return a.prototype[b];c=c();return a.prototype[b]=c};function Nd(a,b){return Object.is(a,b)||a==null&&b==null};var Od=0;function te(a){switch(T(typeof a)){case "number":return O(pe);case "boolean":return O(se);case "string":return O(ve);case "function":return O(we)}if(a instanceof ud)a=O(xe);else if(a instanceof L)a=O(Qd(a));else if(Array.isArray(a))a=(a=a.ma)?O(a.Y,a.X):O(L,1);else if(a!=null)a=O(ye);else throw new TypeError("null.getClass()");return a};function we(){}we.prototype.B=["",1];function ye(){}u(ye,L);ye.prototype.B=["",0];function U(){this.V=0}u(U,ne);function ze(a){a>-129&&a<128?(be(),a=ae[a+128|0]):a=ee(a);return a}function ee(a){var b=new U;b.V=a;return b}U.prototype.equals=function(a){return Ae(a)&&R(a,Ae,U).V==this.V};U.prototype.ra=ba("V");U.prototype.toString=function(){return""+this.V};function Ae(a){return a instanceof U}U.prototype.B=["java.lang.Integer",0];function xe(){}u(xe,ne);xe.prototype.B=["java.lang.Long",0];function Be(){}u(Be,ie);Be.prototype.B=["java.lang.NumberFormatException",0];function T(a){if(a==null)throw Wd().g;return a};function ce(){var a=[256];return Ce(a,{Y:U,la:Ae,X:a.length})}function Ce(a,b){var c=a[0];if(c==null)return null;var d=new globalThis.Array(c);b&&(d.ma=b);if(a.length>1){a=a.slice(1);b=b&&{Y:b.Y,la:b.la,X:b.X-1};for(var e=0;e1){d=e.Y;var f=e.la;e=e.X-1;if(c!=null&&Array.isArray(c)){var g=c.ma||{Y:L,X:1},h=g.X;h==e?(e=g.Y,d=e===d?!0:d&&d.prototype.Ba||e&&e.prototype.Ba?!1:f(e.prototype)):d=h>e?L==d:!1}else d=!1;if(!d){d=!1;break a}}else if(c!=null&&!e.la(c)){d=!1;break a}d=!0}if(!d)throw a=new ge,Q(a),P(a,Error(a)),a.g;a[b]=c};function ve(){}u(ve,L);function M(a){return a==null?"null":a.toString()}function De(a){if(!(a>=0))throw a=new ie,Q(a),P(a,Error(a)),a.g;return"0".repeat(a)}ve.prototype.B=["java.lang.String",0];function Ee(a,b){this.g=a;this.j=b}u(Ee,L);function O(a,b){var c=b||0;return ue(a,"$$class/"+c,function(){return new Ee(a,c)})}function Pd(a){return a.j!=0?M(Fe("[",a.j))+M(a.g.prototype.B[1]==3?a.g.prototype.B[2]:"L"+M(a.g.prototype.B[0])+";"):a.g.prototype.B[0]}function Ge(a,b){b=a.lastIndexOf(b)+1|0;var c=a.length+1|0;if(b<0||b>=c)throw a=new me,a.j="Index: "+b+", Size: "+c,Q(a),P(a,Error(a)),a.g;return a.substr(b)} -Ee.prototype.toString=function(){return String(this.j==0&&this.g.prototype.B[1]==1?"interface ":this.j==0&&this.g.prototype.B[1]==3?"":"class ")+M(Pd(this))};function Fe(a,b){for(var c="",d=0;d>>0).toString(16);b=M(De(Math.max(0,8-b.length|0)))+M(b);a=(a(2147483647)>>>0).toString(16);return M(a)+M(b)};function Le(){}function Me(a){return a instanceof Array}Le.prototype.B=["Array",0];function Ne(){}function Oe(a){return a instanceof Object}Ne.prototype.B=["Object",0];function Pe(){}function Qe(a){return a instanceof Object}Pe.prototype.B=["Object",0];var Re={Ib:"build-label",lb:"buildLabel",mb:"clientLog",qb:"docId",Kb:"mobile-app-version",Ub:"severity",Zb:"severity-unprefixed",Cb:"isArrayPrototypeIntact",Db:"isEditorElementAttached",wb:"documentCharacterSet",Fb:"isModuleLoadFailure",Sb:"reportName",Jb:"locale",ob:"createdOnServer",Ob:"numUnsavedCommands",pb:"cspViolationContext",Rb:"relatedToBrowserExtension",bc:"workerError",rb:"docosPostLimitExceeded",sb:"docosPostLimitType",tb:"docosReactionLimitExceeded",ub:"docosReactionLimitType",Qb:"origin", -Tb:"saveTakingTooLongOnClient",Wb:"truncatedCommentNotificationsCount",Xb:"truncatedCommentNotificationsFromPayload",Nb:"nonfatalReason",ac:"usesModuleSetsServing"};function Se(){this.g=!1}var Te;u(Se,L);p=Se.prototype;p.dispose=function(){if(this.g)var a=null;else this.g=!0,a=this.o==null?Te:this.o,this.o=null;if(a!=null){this.na();if(a.length!=0)for(var b=0;b4);e++)b[ef(a[e])]||(c+="\nInner error "+d++ +": ",a[e].stack&&a[e].stack.indexOf(a[e].toString())==0||(c+=typeof a[e]==="string"?a[e]:a[e].message+"\n"),c+=cf(a[e],b));e=0)c.push("[...circular reference...]");else if(a&&b.length<50){c.push(df(a)+"(");for(var d=a.arguments,e=0;d&&e0&&c.push(", ");var f=d[e];switch(typeof f){case "object":f=f?"object":"null";break;case "string":break;case "number":f=String(f);break;case "boolean":f=f?"true":"false";break;case "function":f=(f=df(f))?f:"[fn]";break;default:f=typeof f}f.length>40&&(f=f.slice(0,40)+"...");c.push(f)}b.push(a);c.push(")\n"); -try{c.push(jf(a.caller,b))}catch(g){c.push("[exception trying to get caller]\n")}}else a?c.push("[...long stack...]"):c.push("[end]");return c.join("")}function df(a){if(kf[a])return kf[a];a=String(a);if(!kf[a]){var b=/function\s+([^\(]+)/m.exec(a);kf[a]=b?b[1]:"[Anonymous]"}return kf[a]}var kf={};function lf(a,b){this.name=a;this.value=b}lf.prototype.toString=ba("name");var mf=new lf("SEVERE",1E3),nf=new lf("WARNING",900),of=new lf("CONFIG",700);function pf(){this.clear()}var qf;function rf(a){var b=sf(),c=b.g;if(c[0]){var d=b.j;b=b.l?d:-1;do b=(b+1)%0,a(c[b]);while(b!==d)}}pf.prototype.clear=function(){this.g=[];this.j=-1;this.l=!1};function sf(){qf||(qf=new pf);return qf};function tf(a,b,c,d,e,f,g){var h="";a&&(h+=a+":");c&&(h+="//",b&&(h+=b+"@"),h+=c,d&&(h+=":"+d));e&&(h+=e);f&&(h+="?"+f);g&&(h+="#"+g);return h}var uf=RegExp("^(?:([^:/?#.]+):)?(?://(?:([^\\\\/?#]*)@)?([^\\\\/?#]*?)(?::([0-9]+))?(?=[\\\\/?#]|$))?([^?#]+)?(?:\\?([^#]*))?(?:#([\\s\\S]*))?$"); -function vf(a,b){if(a){a=a.split("&");for(var c=0;c=0){var f=a[c].substring(0,d);e=a[c].substring(d+1)}else f=a[c];b(f,e?decodeURIComponent(e.replace(/\+/g," ")):"")}}}function wf(a,b){if(!b)return a;var c=a.indexOf("#");c<0&&(c=a.length);var d=a.indexOf("?");if(d<0||d>c){d=c;var e=""}else e=a.substring(d+1,c);a=[a.slice(0,d),e,a.slice(c)];c=a[1];a[1]=b?c?c+"&"+b:b:c;return a[0]+(a[1]?"?"+a[1]:"")+a[2]} -function xf(a,b,c){if(Array.isArray(b))for(var d=0;d0){this.j--;var a=this.g;this.g=a.next;a.next=null}else a=this.l();return a};function Gf(a,b){a.o(b);a.j<100&&(a.j++,b.next=a.g,a.g=b)};var Hf=[],If=[],Jf=!1;function Kf(a){Hf[Hf.length]=a;if(Jf)for(var b=0;b1)));g=g.next)e||(f=g);e&&(c.g==0&&d==1?ig(c,b):(f?(d=f,d.next==c.o&&(c.o=d),d.next=d.next.next):jg(c),kg(c,e,3,b)))}a.l=null}else Wf(a,3,b)}function lg(a,b){a.j||a.g!=2&&a.g!=3||ng(a);a.o?a.o.next=b:a.j=b;a.o=b} -function gg(a,b,c,d){var e=Zf(null,null,null);e.g=new X(function(f,g){e.o=b?function(h){try{var k=b.call(d,h);f(k)}catch(l){g(l)}}:f;e.j=c?function(h){try{var k=c.call(d,h);k===void 0&&h instanceof hg?g(h):f(k)}catch(l){g(l)}}:g});e.g.l=a;lg(a,e);return e.g}p.ib=function(a){this.g=0;Wf(this,2,a)};p.jb=function(a){this.g=0;Wf(this,3,a)}; -function Wf(a,b,c){a.g==0&&(a===c&&(b=3,c=new TypeError("Promise cannot resolve to itself")),a.g=1,bg(c,a.ib,a.jb,a)||(a.J=c,a.g=b,a.l=null,ng(a),b!=3||c instanceof hg||og(a,c)))}function bg(a,b,c,d){if(a instanceof X)return lg(a,Zf(b||Uf,c||null,d)),!0;if(Vf(a))return a.then(b,c,d),!0;if(Aa(a))try{var e=a.then;if(typeof e==="function")return pg(a,e,b,c,d),!0}catch(f){return c.call(d,f),!0}return!1} -function pg(a,b,c,d,e){function f(k){h||(h=!0,d.call(e,k))}function g(k){h||(h=!0,c.call(e,k))}var h=!1;try{b.call(a,g,f)}catch(k){f(k)}}function ng(a){a.G||(a.G=!0,Rf(a.Ua,a))}function jg(a){var b=null;a.j&&(b=a.j,a.j=b.next,b.next=null);a.j||(a.o=null);return b}p.Ua=function(){for(var a;a=jg(this);)kg(this,a,this.g,this.J);this.G=!1}; -function kg(a,b,c,d){if(c==3&&b.j&&!b.v)for(;a&&a.v;a=a.l)a.v=!1;if(b.g)b.g.l=null,qg(b,c,d);else try{b.v?b.o.call(b.l):qg(b,c,d)}catch(e){rg.call(null,e)}Gf(Yf,b)}function qg(a,b,c){b==2?a.o.call(a.l,c):a.j&&a.j.call(a.l,c)}function og(a,b){a.v=!0;Rf(function(){a.v&&rg.call(null,b)})}var rg=Ia;function hg(a){A.call(this,a);this.g=!1}z(hg,A);hg.prototype.name="cancel";function fg(a,b,c){this.promise=a;this.resolve=b;this.reject=c};/* - - Copyright 2005, 2007 Bob Ippolito. All Rights Reserved. - Copyright The Closure Library Authors. - SPDX-License-Identifier: MIT -*/ -function sg(){this.v=[];this.o=this.l=!1;this.j=void 0;this.D=this.K=this.J=!1;this.G=0;this.g=null;this.A=0}sg.prototype.cancel=function(a){if(this.l)this.j instanceof sg&&this.j.cancel();else{if(this.g){var b=this.g;delete this.g;a?b.cancel(a):(b.A--,b.A<=0&&b.cancel())}this.D=!0;this.l||(a=new tg(this),ug(this),vg(this,!1,a))}};sg.prototype.H=function(a,b){this.J=!1;vg(this,a,b)};function vg(a,b,c){a.l=!0;a.j=c;a.o=!b;wg(a)}function ug(a){if(a.l){if(!a.D)throw new xg(a);a.D=!1}} -function yg(a){throw a;}function zg(a,b,c){return Ag(a,b,null,c)}function Bg(a,b,c){Ag(a,b,function(d){var e=b.call(this,d);if(e===void 0)throw d;return e},c)}function Ag(a,b,c,d){var e=a.l;e||(b===c?b=c=Ef(b):(b=Ef(b),c=Ef(c)));a.v.push([b,c,d]);e&&wg(a);return a}sg.prototype.then=function(a,b,c){var d,e,f=new X(function(g,h){e=g;d=h});Ag(this,e,function(g){g instanceof tg?f.cancel():d(g);return Cg},this);return f.then(a,b,c)};sg.prototype.$goog_Thenable=!0; -function Dg(a){return Ra(a.v,function(b){return typeof b[1]==="function"})}var Cg={}; -function wg(a){if(a.G&&a.l&&Dg(a)){var b=a.G,c=Eg[b];c&&(w.clearTimeout(c.g),delete Eg[b]);a.G=0}a.g&&(a.g.A--,delete a.g);b=a.j;for(var d=c=!1;a.v.length&&!a.J;){var e=a.v.shift(),f=e[0],g=e[1];e=e[2];if(f=a.o?g:f)try{var h=f.call(e||null,b);h===Cg&&(h=void 0);h!==void 0&&(a.o=a.o&&(h==b||h instanceof Error),a.j=b=h);if(Vf(b)||typeof w.Promise==="function"&&b instanceof w.Promise)d=!0,a.J=!0}catch(k){b=k,a.o=!0,Dg(a)||(c=!0)}}a.j=b;d&&(h=x(a.H,a,!0),d=x(a.H,a,!1),b instanceof sg?(Ag(b,h,d),b.K=!0): -b.then(h,d));c&&(b=new Fg(b),Eg[b.g]=b,a.G=b.g)}function Gg(a){var b=new sg;ug(b);vg(b,!0,a);return b}function xg(){A.call(this)}z(xg,A);xg.prototype.message="Deferred has already fired";xg.prototype.name="AlreadyCalledError";function tg(){A.call(this)}z(tg,A);tg.prototype.message="Deferred was canceled";tg.prototype.name="CanceledError";function Fg(a){this.g=w.setTimeout(x(this.l,this),0);this.j=a}Fg.prototype.l=function(){delete Eg[this.g];yg(this.j)};var Eg={};function Hg(){}function Ig(a){return a!=null&&!!a.wa}Hg.prototype.wa=!0;Hg.prototype.B=["javax.inject.Provider",1];function Jg(){}function Kg(a){return a!=null&&!!a.va}Jg.prototype.va=!0;Jg.prototype.B=["com.google.apps.docs.xplat.flag.FlagService",1];var Lg;function Mg(){if(Lg==null){var a=new Ng(null);Lg=function(){return a}}var b;return R((b=Lg,b()),Kg,Jg)};function Og(){}u(Og,L);Og.prototype.get=function(){if(this.j==null){var a=R(w._docs_flag_initialData,Oe,Ne);this.j=a!=null?a:R({},Oe,Ne)}return this.j};Og.prototype.g=function(){return this.get()};Og.prototype.wa=!0;Og.prototype.B=["com.google.apps.docs.xplat.flag.FlagServiceHelper",0];function Pg(a){return typeof a=="string"?a=="true"||a=="1":!!a};function Ng(a){this.g=new Og;this.j=null;if(a!=null)for(var b in a){var c=b,d=a[b];if(this.j!=null)throw ke("Cannot use setClientFlag when comparison is enabled.").g;var e=R(this.g.g(),Oe,Ne);Ae(d)?(d=R(d,Ae,U).V,e[c]=d):e[c]=d!=null?d:null}}u(Ng,L);Ng.prototype.clear=function(){this.g=new Og;this.j=null};Ng.prototype.get=function(a){Qg(this,a);return R(this.g.g(),Oe,Ne)[a]};function Rg(a,b){a=R(a.g.g(),Oe,Ne);return b in a} -function Sg(a,b){Qg(a,b);if(!Rg(a,b)||a.get(b)==null)return NaN;try{var c=M(a.get(b));oe==null&&(oe=RegExp("^\\s*[+-]?(NaN|Infinity|((\\d+\\.?\\d*)|(\\.\\d+))([eE][+-]?\\d+)?[dDfF]?)\\s*$"));if(!oe.test(c)){var d=new Be;d.j='For input string: "'+M(c)+'"';Q(d);P(d,Error(d));throw d.g;}return parseFloat(c)}catch(f){var e=Vd(f);if(e instanceof Be)return NaN;throw e.g;}} -function Tg(a,b){Qg(a,b);if(!Rg(a,b))return"";a=a.get(b);if(a==null)a="";else{if(b="number"===typeof a){b=qe(T(a));var c=qe(T(a));b=b.equals(c)}a=b?""+qe(T(a)):M(a)}return a} -function Qg(a,b){if(a.j!=null){try{var c=R(a.g.g(),Oe,Ne)[b]}catch(h){var d=Vd(h);if(d instanceof S)c="injection-failed";else throw d.g;}try{var e=a.j;if(e==null)throw Wd().g;var f=R(R(e,Ig,Hg).g(),Oe,Ne)[b]}catch(h){var g=Vd(h);if(g instanceof S)f="injection-failed";else throw g.g;}a=c;!(b=Nd(a,f))&&(b=a!=null)&&(b=a.equals?a.equals(f):Object.is(a,f));if(!b)throw ke("Logging is not supported.").g;}}Ng.prototype.va=!0;Ng.prototype.B=["com.google.apps.docs.xplat.flag.FlagServiceImpl",0];function Ug(a){He.call(this,a,null);P(this,Error(this))}u(Ug,He);Ug.prototype.B=["com.google.apps.docs.xplat.net.LimitException",0];function Vg(a,b,c,d){Ue();this.g=!1;this.G=a;this.l=b;this.j=new Wg(Math.imul(c,1E3),d)}u(Vg,Se);function Xg(a){if(!((a.j.get(null)+1|0)/T(a.j.l/1E3)<=a.l))throw(new Ug("Query would cause "+M(a.G)+" to exceed "+a.l+" qps.")).g;a=a.j;var b=vd(Cd(Date.now()));Yg(a,b);var c=R(Zg(a.g),$g,ah);if(c==null||T(b)>=T(c.j))b=bh(a,T(b)),c=new ah,c.j=b,c.g=0,c.o=2147483647,c.l=-2147483648,a.g.add(c);c.g=c.g+1|0;c.o=Math.min(1,c.o);c.l=Math.max(1,c.l)} -Vg.prototype.B=["com.google.apps.docs.xplat.net.QpsLimiter",0];function ah(){this.l=this.o=this.g=0}u(ah,L);function $g(a){return a instanceof ah}ah.prototype.B=["com.google.apps.docs.xplat.util.BasicStat$Slot",0];function Wg(a){this.j=0;this.l=a;this.j=re(a/50);this.g=new ch(ze(50))}u(Wg,L);Wg.prototype.get=function(a){return dh(this,a,function(b,c){b=R(b,Ae,U);c=R(c,$g,ah);return ze(b.V+c.g|0)})};function dh(a,b,c){b=b!=null?T(b):vd(Cd(Date.now()));Yg(a,b);var d=0;b=bh(a,T(b));b=T(b)-a.l;for(var e=a.g.g.length-1|0;e>=0;e=e-1|0){var f=R(a.g.get(e),$g,ah);if(T(f.j)<=b)break;d=R(c(ze(d),f),Ae,U).V}return d}function bh(a,b){return a.j*Math.floor(b/a.j+1)} -function Yg(a,b){var c=R(Zg(a.g),$g,ah);c!=null&&(c=T(c.j)-a.j,T(b)=a.g.length)throw a=new $d,Q(a),P(a,Error(a)),a.g;return a.g.length1||f.length==1&& -f[0]!="")&&f.pop(),d&&g==e.length&&f.push("")):(f.push(h),d=!0)}d=f.join("/")}else d=e}c?uh(b,d):c=a.l.toString()!=="";c?vh(b,a.l.clone()):c=!!a.G;c&&(b.G=a.G);return b};rh.prototype.clone=function(){return new rh(this)};function sh(a,b,c){a.o=c?wh(b,!0):b;a.o&&(a.o=a.o.replace(/:$/,""))}function th(a,b){if(b){b=Number(b);if(isNaN(b)||b<0)throw Error("Bad port number "+b);a.A=b}else a.A=null}function uh(a,b,c){a.j=c?wh(b,!0):b;return a} -function vh(a,b,c){b instanceof xh?(a.l=b,Dh(a.l,a.v)):(c||(b=yh(b,Eh)),a.l=new xh(b,a.v))}function wh(a,b){return a?b?decodeURI(a.replace(/%25/g,"%2525")):decodeURIComponent(a):""}function yh(a,b,c){return typeof a==="string"?(a=encodeURI(a).replace(b,Fh),c&&(a=a.replace(/%25([0-9a-fA-F]{2})/g,"%$1")),a):null}function Fh(a){a=a.charCodeAt(0);return"%"+(a>>4&15).toString(16)+(a&15).toString(16)}var zh=/[#\/\?@]/g,Bh=/[#\?:]/g,Ah=/[#\?]/g,Eh=/[#\?@]/g,Ch=/#/g; -function xh(a,b){this.j=this.g=null;this.l=a||null;this.o=!!b}function Gh(a){a.g||(a.g=new Map,a.j=0,a.l&&vf(a.l,function(b,c){a.add(decodeURIComponent(b.replace(/\+/g," ")),c)}))}p=xh.prototype;p.add=function(a,b){Gh(this);this.l=null;a=Hh(this,a);var c=this.g.get(a);c||this.g.set(a,c=[]);c.push(b);this.j=this.j+1;return this};p.remove=function(a){Gh(this);a=Hh(this,a);return this.g.has(a)?(this.l=null,this.j=this.j-this.g.get(a).length,this.g.delete(a)):!1}; -p.clear=function(){this.g=this.l=null;this.j=0};function Ih(a,b){Gh(a);b=Hh(a,b);return a.g.has(b)}p.forEach=function(a,b){Gh(this);this.g.forEach(function(c,d){c.forEach(function(e){a.call(b,e,d,this)},this)},this)};p.ha=function(a){Gh(this);var b=[];if(typeof a==="string")Ih(this,a)&&(b=b.concat(this.g.get(Hh(this,a))));else{a=Array.from(this.g.values());for(var c=0;c0?String(a[0]):b}; -p.toString=function(){if(this.l)return this.l;if(!this.g)return"";for(var a=[],b=Array.from(this.g.keys()),c=0;c0)){this.l=null;d=this.g;var f=d.set;e=Hh(this,e);var g=c.length;if(g>0){for(var h=Array(g),k=0;k-1?(b=a[g],c||(b.ea=!1)):(b=new Qh(b,this.src,f,!!d,e),b.ea=c,a.push(b));return b};Sh.prototype.remove=function(a,b,c,d){a=a.toString();if(!(a in this.g))return!1;var e=this.g[a];b=Th(e,b,c,d);return b>-1?(Rh(e[b]),Array.prototype.splice.call(e,b,1),e.length==0&&(delete this.g[a],this.j--),!0):!1}; -function Uh(a,b){var c=b.type;c in a.g&&Sa(a.g[c],b)&&(Rh(b),a.g[c].length==0&&(delete a.g[c],a.j--))}Sh.prototype.removeAll=function(a){a=a&&a.toString();var b=0,c;for(c in this.g)if(!a||c==a){for(var d=this.g[c],e=0;e-1?b[a]:null)&&gi(c))} -function gi(a){if(typeof a!=="number"&&a&&!a.removed){var b=a.src;if(b&&b[Oh])Uh(b.j,a);else{var c=a.type,d=a.proxy;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(di(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Xh--;(c=bi(b))?(Uh(c,a),c.j==0&&(c.src=null,b[Vh]=null)):Rh(a)}}}function di(a){return a in Wh?Wh[a]:Wh[a]="on"+a} -function ei(a,b){if(a.removed)a=!0;else{b=new Nh(b,this);var c=a.listener,d=a.ja||a.src;a.ea&&gi(a);a=c.call(d,b)}return a}function bi(a){a=a[Vh];return a instanceof Sh?a:null}var hi="__closure_events_fn_"+(Math.random()*1E9>>>0);function $h(a){if(typeof a==="function")return a;a[hi]||(a[hi]=function(b){return a.handleEvent(b)});return a[hi]}Kf(function(a){ei=a(ei)});function ii(a,b){Lh.call(this,a);this.error=b}u(ii,Lh);var ji=/\/d\/([^\/]+)/,ki=/\/r\/([^\/]+)/;function li(a){a=a.match(uf)[5]||null;return ji.test(a)}function mi(a,b){if(li(a)){li(a);a=a.match(uf);var c=a[5];c=c.replace(b,"");b=tf(a[1],a[2],a[3],a[4],c,a[6],a[7])}else b=a;return b};function Z(){W.call(this);this.j=new Sh(this);this.Da=this;this.P=null}z(Z,W);Z.prototype[Oh]=!0;p=Z.prototype;p.addEventListener=function(a,b,c,d){Yh(this,a,b,c,d)};p.removeEventListener=function(a,b,c,d){fi(this,a,b,c,d)}; -p.dispatchEvent=function(a){var b=this.P;if(b){var c=[];for(var d=1;b;b=b.P)c.push(b),++d}b=this.Da;d=a.type||a;if(typeof a==="string")a=new Lh(a,b);else if(a instanceof Lh)a.target=a.target||b;else{var e=a;a=new Lh(d,b);qh(a,e)}e=!0;var f;if(c)for(f=c.length-1;!a.j&&f>=0;f--){var g=a.currentTarget=c[f];e=ni(g,d,!0,a)&&e}a.j||(g=a.currentTarget=b,e=ni(g,d,!0,a)&&e,a.j||(e=ni(g,d,!1,a)&&e));if(c)for(f=0;!a.j&&f2147483647?-1:w.setTimeout(a,b||0)}function pi(){var a=null;return(new X(function(b,c){a=oi(function(){b(void 0)},14E3);a==-1&&c(Error("Failed to schedule timer."))})).oa(function(b){w.clearTimeout(a);throw b;})};function qi(a,b,c){W.call(this);this.g=a;this.l=b||0;this.j=c;this.o=x(this.Sa,this)}z(qi,W);p=qi.prototype;p.aa=0;p.L=function(){qi.T.L.call(this);this.stop();delete this.g;delete this.j};p.start=function(a){this.stop();this.aa=oi(this.o,a!==void 0?a:this.l)};p.stop=function(){this.isActive()&&w.clearTimeout(this.aa);this.aa=0};p.isActive=function(){return this.aa!=0};p.Sa=function(){this.aa=0;this.g&&this.g.call(this.j)};function ri(a,b,c,d){W.call(this);this.l=d!=null?d:.15;this.v=a;this.o=b;this.D=c;this.g=new qi(this.fb,void 0,this);this.A=Number.NEGATIVE_INFINITY;this.j=0}u(ri,W);p=ri.prototype;p.isActive=function(){return this.g.isActive()};p.start=function(){si(this,!1,!1)};function si(a,b,c){b&&(a.g.stop(),ti(a,a.o));a.isActive()||(b=Math.max(0,a.A+a.j-Date.now()),b==0&&(c?b=ti(a,a.o):a.j=0),a.g.start(b))}p.stop=function(){this.g.stop()}; -function ti(a,b){b>0&&a.l!=0&&(b=Math.floor(b*(1-a.l+Math.random()*a.l*2)));return a.j=b}p.fb=function(){this.A=Date.now();ti(this,Math.min(Math.max(this.j*2,this.o),this.D));this.v()};p.L=function(){this.g.dispose();delete this.g;delete this.v;W.prototype.L.call(this)};function ui(a){W.call(this);this.j=a;this.g={}}z(ui,W);var vi=[];ui.prototype.listen=function(a,b,c,d){Array.isArray(b)||(b&&(vi[0]=b.toString()),b=vi);for(var e=0;e=3&&(h.S= -(ih(),hh));h.l.getState().g>=3||h.S!==(ih(),hh)||xi(h)});this.R=g;this.M=Pg(this.O.get("docs-epfdfjes"));this.ca={}}u(wi,W);p=wi.prototype;p.send=function(a,b,c,d){Pg(this.O.get("docs-dafjera"))&&(a=mi(mi(a,ki),ji));var e=zg(zg(Gg(this.o.length),function(f){if(!(f>=this.da))return this.R&&(a=V(a,"errorSender_enqueueTimeMs",Date.now().toString())),f={},f.u=a,f.m=b,f.c=c,f.h=d,this.enqueue(f)},this),this.sa,this);Bg(e,function(){this.A.delete(e)},this);this.A.add(e)}; -function yi(a){return dg(Array.from(a.A.values())).then(n())}p.sa=function(){var a=this.l&&this.l.getState().g>=3,b=this.ka()||this.g.isActive()||this.j.isActive()||this.N;return a||b?Gg():zi(this)};function zi(a){return function(){return zg(Gg(a.o[0]!==void 0?a.o[0]:null),function(b){return Ai(a,b)})}()} -function Ai(a,b){if(a.j.isActive()||a.g.isActive()||a.N)return Gg();if(!b)return a.j.stop(),Gg();if(b.u.length>4E3)return Bi(a);try{Xg(a.U);a.K=new sg;var c=b.u;a.ba!=null&&(c=V(c,"reportingSessionId",a.ba));a.v>0&&(c=V(c,"retryCount",a.v));a.D!=null&&(c=V(c,"previousErrorSendStatus",a.D));a.R&&(c=V(c,"errorSenderType",a.ya()),b.errorSender_frontIndex&&(c=V(c,"errorSender_frontIndex",b.errorSender_frontIndex)),b.errorSender_nextIndex&&(c=V(c,"errorSender_nextIndex",b.errorSender_nextIndex)),b.errorSender_queueSize&& -(c=V(c,"errorSender_queueSize",b.errorSender_queueSize)));var d=Gg();a.M&&(a.ca=b,d=Bi(a));var e=b.m,f=b.c,g=b.h;return zg(zg(d,function(){a.g.send(c,e,f,g)}),function(){return a.K})}catch(h){if(Ve(h)instanceof Ug)a.N=!0;else throw hf(h,{"docs-origin-class":"docs.debug.ErrorSender"});}return Gg()} -p.ab=function(){var a=Ci(this.g),b=this.K,c=Di(this.g)||a>=400&&a<=500,d=this.v>3;c||d?(this.v=0,this.D=null,this.j.stop(),zg(this.M?Gg():Bi(this),function(){ug(b);vg(b,!0)})):(this.v++,this.D=a===-1?this.g.A:a,xi(this),this.M&&this.enqueue(this.ca),ug(b),vg(b,!0))};function xi(a){a.v!=1||a.j.isActive()?a.j.start():si(a.j,!0,!0)}p.L=function(){Cf(this.H,this.j,this.g,this.P);this.A.clear();W.prototype.L.call(this)};p.ya=ca("BaseErrorSender");function Ei(a,b,c,d,e){wi.call(this,a,b,c,void 0,d,e,void 0);this.o=[]}u(Ei,wi);Ei.prototype.enqueue=function(a){this.o.push(a);return Gg()};function Bi(a){a.o.shift();return Gg()}Ei.prototype.ya=ca("MemoryErrorSender");Ei.prototype.L=function(){delete this.o;wi.prototype.L.call(this)};function Fi(a){this.g=gd(Md(),yc(a));a=$c(this.g,1);this.j=Math.floor(Math.random()*100) \\d+"),RegExp("getReadMode(Config|Render|Extract)")],aj=[RegExp("@file:///|phantomjs|node:electron|py-scrap|eval code|Program Files")],bj=[RegExp("Script https://meet\\.google\\.com/.*meetsw.*load failed"),RegExp("A bad HTTP response code \\(\\d+\\) was received when fetching the script")], -cj=[RegExp("Error loading.*Consecutive load failures"),RegExp("Failed to load module.*Consecutive load failures")];function dj(a,b){this.pa=a;this.ga=b}function ej(a,b){return(b=a.g(b))?{pa:a.pa,ga:a.ga,ua:b.toUpperCase()}:null};function fj(){dj.call(this,1,1)}u(fj,dj);fj.prototype.g=function(a){a:{a=gj(a);for(var b=!1,c=v(Zi),d=c.next();!d.done;d=c.next()){d=a.matchAll(d.value);d=v(d);for(var e=d.next();!e.done;e=d.next())if(e=e.value[1]){if(Yi.includes(e)){a=!1;break a}b=!0}}a=b}return a?"warning":null};function hj(a,b,c,d){this.message=a;this.g=b;this.cause=c;this.j=d}function ij(a){return(a=a.cause)?a.message+"\n"+a.g+"\n"+ij(a):""}function gj(a){return a.message+"\n"+a.g+"\n"+ij(a)}function jj(){this.j=this.g=this.message=""}function kj(a,b){a.message=b;return a};function lj(a){return a instanceof Error||a&&a.message!==void 0?a.message:mj(a)}function nj(a){return a instanceof Error||a&&a.stack!==void 0?a.stack||"":""}function oj(a,b){var c=a&&a.cause!==void 0;if(b>=3||!c)return null;c=new jj;a=a.cause;if(a instanceof Error||a.message!==void 0&&a.stack!==void 0){if(kj(c,lj(a)),c.g=nj(a),b=oj(a,b+1))c.cause=b}else kj(c,mj(a));return new hj(c.message,c.g,c.cause,c.j)} -function mj(a){try{return a&&a instanceof Object?JSON.stringify(a):String(a)}catch(b){return String(a)}}function pj(a,b){var c=kj(new jj,lj(a));c.g=nj(a);if(a=oj(a,0))c.cause=a;b&&(c.j=b);return new hj(c.message,c.g,c.cause,c.j)};function qj(a,b,c,d){dj.call(this,c,d);this.j=a;this.l=b}u(qj,dj);qj.prototype.g=function(a){var b=ij(a);return rj(a.message,this.j)||rj(a.g,this.l)||rj(b,this.j)||rj(b,this.l)?"warning":null};function rj(a,b){b=v(b);for(var c=b.next();!c.done;c=b.next())if(c.value.test(a))return!0;return!1};function sj(a,b,c,d,e){dj.call(this,c,d);this.j=a;this.o=b;this.l=e}u(sj,dj);sj.prototype.g=function(a){if(this.l)a:{a=a.message;for(var b=v(this.j),c=b.next();!c.done;c=b.next())if(a===c.value){a=!0;break a}a=!1}else a=gj(a),a=tj(a,this.j)||tj(a,this.o);return a?"warning":null};function tj(a,b){b=v(b);for(var c=b.next();!c.done;c=b.next())if(a.includes(c.value))return!0;return!1}function uj(a,b,c,d){return new sj(a,b,c,d,!1)};var vj=[new fj,uj("Trusted Type;TrustedHTML;TrustedScript;cannot communicate with background;zaloJSV2;kaspersky-labs;@user-script;Object Not Found Matching Id;contextChanged;Not implemented on this platform;Extension context invalidated;neurosurgeonundergo;realTimeClData;Failed to execute 'querySelectorAll' on 'Document';Promise.all(...).then(...).catch(...).finally is not a function;Error executing Chrome API, chrome.tabs;Identifier 'originalPrompt' has already been declared;User rejected the request;Could not inject ethereum provider because it's not your default extension;Cannot redefine property: googletag;Can't find variable: HTMLDialogElement;Identifier 'listenerName' has already been declared;Cannot read properties of undefined (reading 'info');Permission denied to access property \"type\";Error: Promise timed out;Request timeout ToolbarStatus;Can't find variable: nc;imtgo;ton is not a function;__renderMessageNode is not defined;Cannot redefine property: ethereum;unknown action:;Receiving end does not exist;get-frame-manager-configuration;Key not found;'isAWS'".split(";"), -"puppeteer-core;kaspersky-labs;@user-script;jsQuilting;linkbolic;neurosurgeonundergo;tlscdn;https://cdnjs.cloudflare.com/ajax/libs/mathjax/;secured-pixel.com;Can't find variable: nc;imtgo;_simulateEvent;goguardian".split(";"),1,0),new qj(Xi,Wi,1,0),uj('status is 0, navigator.onLine =;Network sync is disabled. Aborting a network request of int type;The service is currently unavailable.;Internal error encountered.;data does not exist in AF cache;There was an error during the transport or processing of this request;Failed to load gapi;Rpc failed due to xhr error. error code: 6, error: [0];An interceptor has requested that the request be retried;8,"generic";A network error occurred'.split(";"), -Vi,2,0),new qj($i,aj,3,0),uj("Kg is not defined;uncaught error;The play method is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.;Illegal invocation;Script error;zCommon;can't access dead object;Java exception was raised during method invocation;pauseVideo is not a function;ResizeObserver loop;wallet must has at least one account;xbrowser is not defined;jQuery is not defined;Cannot read properties of null (reading 'requestAnimationFrame');Class extends value undefined is not a constructor or null;GM3TooltipService: No tooltip with id;Mole was disposed;getInitialTopicListResponse is missing for stream rendering;getPeopleById call preempted;The operation is insecure;class heritage;The play() request was interrupted;args.site.enabledFeatures is undefined;frappe is not defined;Cannot set properties of undefined (setting 'hidden');Identifier 'checkOngoingMeeting' has already been declared;AutofillCallbackHandler;invalid wire type;zp_token;isReCreate;HTMLOUT is not defined;Shopify root is null;CanvasMaskingStrategy_Redact;_chromeNamespace;feature named `performanceMetrics`;feature named `webCompat`;enableDidUserTypeOnKeyboardLogging;Cannot redefine property: webdriver".split(";"), -["postUserData"],3,0),new qj(bj,Wi,5,0),uj("Service worker registration is disabled by MDA;An unknown error occurred when fetching the script;Operation has been aborted;Timed out while trying to start the Service Worker;The Service Worker system has shutdown;The user denied permission to use Service Worker;The script resource is behind a redirect, which is disallowed;The document is in an invalid state;ServiceWorker script evaluation failed;ServiceWorker cannot be started;Failed to access storage;Worker disallowed;encountered an error during installation".split(";"), -Vi,5,0),new qj(cj,cj,4,0),uj(["Timeout reached for loading script https://www.gstatic.com/_/apps-fileview/_/js/","Error while loading script https://www.gstatic.com/_/apps-fileview/_/js/"],Vi,4,0)],wj=new Set(["SEVERE","SEVERE_AFTER_INITIAL","UNKNOWN","FATAL",""]);function xj(a){this.j=a;this.g=!1} -function yj(a,b){var c="missing",d=new Map,e=!0;try{c=b.j;a.g&&d.set("apps_telemetry.after_downgraded_severe","true");for(var f=v(a.j),g=f.next();!g.done;g=f.next()){var h=g.value;try{var k=ej(h,b);if(k){var l=c,m=zj(a,c)?k.ua:c;Aj(k,l,m).forEach(function(r,y){d.set(y,r)});c=m;break}}catch(r){e=!1;var t=pj(r,c);d.set("apps_telemetry.handling_error",gj(t)+"\n\nclassifier: "+h.constructor.name)}}}catch(r){e=!1,a=pj(r,c),d.set("apps_telemetry.handling_error",gj(a))}d.set("apps_telemetry.processed",String(e)); -return{ua:c,Ta:d}}function Aj(a,b,c){var d=new Map;d.set("apps_telemetry.classification",a.pa.toString());d.set("apps_telemetry.classification_code",a.ga?a.ga.toString():"");d.set("apps_telemetry.incoming_severity",b);d.set("apps_telemetry.outgoing_severity",c);return d}function zj(a,b){return wj.has(b.toUpperCase())?a.g=!0:!1};function Bj(){}Bj.prototype.Z=function(){if("WorkerGlobalScope"in w&&self instanceof w.WorkerGlobalScope)return new Map;try{var a=Array.from(document.querySelectorAll("script")).filter(this.j).slice(0,30).map(this.g).join("\n")}catch(b){a="Error getting cross-origin scripts"}return(new Map).set("apps_telemetry.cross_origin_scripts",a)}; -Bj.prototype.j=function(a){var b=new RegExp(/^(?:https?:\/\/)?(?:[a-zA-Z0-9-]+\.)*google\.com(?:$|[\/#?])/);return(a=a.getAttribute("src"))?!(a.startsWith("/")||b.test(a)):!1};Bj.prototype.g=function(a){return a.innerHTML?a.outerHTML.slice(0,a.outerHTML.indexOf(a.innerHTML)):a.outerHTML};function Cj(){}Cj.prototype.Z=function(){try{var a=performance.getEntriesByType("resource").slice(-5).map(function(b){return Af(b.name)}).join("\n")}catch(b){a="Error getting last 5 resources"}return(new Map).set("apps_telemetry.resources",a)};/* - -Math.uuid.js (v1.4) -http://www.broofa.com -mailto:robert@broofa.com -Copyright (c) 2010 Robert Kieffer -Dual licensed under the MIT and GPL licenses. -*/ -var Dj="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");function Ej(a,b,c){a=a===void 0?[]:a;b=b===void 0?[]:b;c=c===void 0?[]:c;var d=a;a=[Error("uncaught error").message];var e=[];if(b.length>0){var f=e.push,g=[];b=v(b);for(var h=b.next();!h.done;h=b.next())g.push(new RegExp(h.value));f.call(e,new qj(g,g,7,0))}e.push.apply(e,pa(vj));d=v(d);for(f=d.next();!f.done;f=d.next())e.push(f.value);a.length>0&&e.push(new sj(a,[],3,5,!0));this.l=new xj(e);this.g=[new Ri,new Bj,new Cj];this.g.push.apply(this.g,pa(c));c=[];c[8]=c[13]=c[18]=c[23]="-";c[14]="4";for(a= -0;a<36;a++)c[a]||(e=0|Math.random()*16,c[a]=Dj[a==19?e&3|8:e]);this.j=c.join("")}function Fj(a,b,c,d){d["apps_telemetry.session_id"]=a.j;"apps_telemetry.processed"in d&&(d["apps_telemetry.multi_processed"]="true");var e=a.Z();(a=Gj(a,b,c,e))&&Hj(e,a.Ta);e.forEach(function(g,h){d[h]=g});var f;return(f=a==null?void 0:a.ua)!=null?f:c}function Gj(a,b,c,d){try{var e=pj(b,c);return yj(a.l,e)}catch(f){Ij(d,f,"apps_telemetry.processed")}return null} -Ej.prototype.Z=function(){var a=new Map;try{for(var b=v(this.g),c=b.next();!c.done;c=b.next())c.value.Z().forEach(function(d,e){a.set(e,d)})}catch(d){Ij(a,d,"apps_telemetry.annotated")}return a};function Hj(a,b){b.forEach(function(c,d){a.set(d,c)})}function Ij(a,b,c){a.set(c,"false");a.set("apps_telemetry.handling_error",mj(b))};function Jj(a){var b=a=a===void 0?{}:a;a=b.xa===void 0?[]:b.xa;var c=b.gb===void 0?[]:b.gb,d=b.eb===void 0?[]:b.eb;b=b.cb===void 0?[]:b.cb;try{var e=Fd=Fd||new Gd;var f=Kd.key in e.g?Kd.ctor(e.g[Kd.key]):Kd.defaultValue,g=void 0===Bb?2:4;e=void 0;var h=f.C,k=h[C]|0,l=zb(f,k)?1:g;e=!!e||l===3;l===2&&Fc(f)&&(h=f.C,k=h[C]|0);var m=Pc(h,1),t=m===ub?7:m[C]|0,r=Qc(t,k);if(f=4&r?!1:!0){4&r&&(m=Array.prototype.slice.call(m),t=0,r=Oc(r,k),k=Lc(h,k,1,m));for(var y=g=0;g0&&h.push(uj(c,[],6,0));d.length>0&&h.push(new qj(d,[],6,0));b.length>0&&h.push(uj(b,[],6,5));return new Ej(h,N,[new Oi].concat(pa(a)))};try{var Kj,Lj,Mj=(Lj=(Kj=window)==null?void 0:Kj.top)!=null?Lj:w;Mj.U3bHHf!=null||(Mj.U3bHHf=0);Mj.U3bHHf++}catch(a){w.U3bHHf!=null||(w.U3bHHf=0),w.U3bHHf++};"#".replace(/([-()\[\]{}+?*.$\^|,:#2){var h=Array.prototype.slice.call(arguments,2);g=function(){e.apply(this,h)}}return d(g,f)};c[b][Uj(a,!1)]=d} -Sj.prototype.L=function(){var a=w.window||w.globalThis;var b=a.setTimeout;b=b[Uj(this,!1)]||b;a.setTimeout=b;b=a.setInterval;b=b[Uj(this,!1)]||b;a.setInterval=b;Sj.T.L.call(this)};function Xj(a){A.call(this,"Error in protected function: "+(a&&a.message?String(a.message):String(a)),a);(a=a&&a.stack)&&typeof a==="string"&&(this.stack=a)}z(Xj,A);function ak(){Z.call(this);this.headers=new Map;this.l=!1;this.g=null;this.M="";this.A=0;this.v=this.K=this.D=this.H=!1;this.N=0;this.o=null;this.O="";this.R=!1}z(ak,Z);var bk=/^https?$/i,ck=["POST","PUT"],dk=[];p=ak.prototype;p.Qa=function(){this.dispose();Sa(dk,this)}; -p.send=function(a,b,c,d){if(this.g)throw Error("[goog.net.XhrIo] Object is active with another request="+this.M+"; newUri="+a);b=b?b.toUpperCase():"GET";this.M=a;this.A=0;this.H=!1;this.l=!0;this.g=new XMLHttpRequest;this.g.onreadystatechange=Ef(x(this.Aa,this));try{this.K=!0,this.g.open(b,String(a),!0),this.K=!1}catch(g){ek(this);return}a=c||"";c=new Map(this.headers);if(d)if(Object.getPrototypeOf(d)===Object.prototype)for(var e in d)c.set(e,d[e]);else if(typeof d.keys==="function"&&typeof d.get=== -"function"){e=v(d.keys());for(var f=e.next();!f.done;f=e.next())f=f.value,c.set(f,d.get(f))}else throw Error("Unknown input type for opt_headers: "+String(d));d=Array.from(c.keys()).find(function(g){return"content-type"==g.toLowerCase()});e=w.FormData&&a instanceof w.FormData;!(Array.prototype.indexOf.call(ck,b,void 0)>=0)||d||e||c.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8");b=v(c);for(d=b.next();!d.done;d=b.next())c=v(d.value),d=c.next().value,c=c.next().value,this.g.setRequestHeader(d, -c);this.O&&(this.g.responseType=this.O);"withCredentials"in this.g&&this.g.withCredentials!==this.R&&(this.g.withCredentials=this.R);try{this.o&&(clearTimeout(this.o),this.o=null),this.N>0&&(this.o=setTimeout(this.hb.bind(this),this.N)),this.D=!0,this.g.send(a),this.D=!1}catch(g){ek(this)}};p.hb=function(){typeof va!="undefined"&&this.g&&(this.A=8,this.dispatchEvent("timeout"),this.abort(8))};function ek(a){a.l=!1;a.g&&(a.v=!0,a.g.abort(),a.v=!1);a.A=5;fk(a);gk(a)} -function fk(a){a.H||(a.H=!0,a.dispatchEvent("complete"),a.dispatchEvent("error"))}p.abort=function(a){this.g&&this.l&&(this.l=!1,this.v=!0,this.g.abort(),this.v=!1,this.A=a||7,this.dispatchEvent("complete"),this.dispatchEvent("abort"),gk(this))};p.L=function(){this.g&&(this.l&&(this.l=!1,this.v=!0,this.g.abort(),this.v=!1),gk(this,!0));ak.T.L.call(this)};p.Aa=function(){this.ka()||(this.K||this.D||this.v?hk(this):this.ta())};p.ta=function(){hk(this)}; -function hk(a){if(a.l&&typeof va!="undefined")if(a.D&&(a.g?a.g.readyState:0)==4)setTimeout(a.Aa.bind(a),0);else if(a.dispatchEvent("readystatechange"),(a.g?a.g.readyState:0)==4){a.l=!1;try{Di(a)?(a.dispatchEvent("complete"),a.dispatchEvent("success")):(a.A=6,fk(a))}finally{gk(a)}}}function gk(a,b){if(a.g){a.o&&(clearTimeout(a.o),a.o=null);var c=a.g;a.g=null;b||a.dispatchEvent("ready");try{c.onreadystatechange=null}catch(d){}}}p.isActive=function(){return!!this.g}; -function Di(a){var b=Ci(a);a:switch(b){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var c=!0;break a;default:c=!1}if(!c){if(b=b===0)a=String(a.M).match(uf)[1]||null,!a&&w.self&&w.self.location&&(a=w.self.location.protocol.slice(0,-1)),b=!bk.test(a?a.toLowerCase():"");c=b}return c}function Ci(a){try{return(a.g?a.g.readyState:0)>2?a.g.status:-1}catch(b){return-1}}Kf(function(a){ak.prototype.ta=a(ak.prototype.ta)});function ik(a,b,c){Z.call(this);this.v=b||null;this.o={};this.A=jk;this.H=a;if(!c){this.g=null;this.g=new Sj(x(this.l,this));Zj(this.g,"setTimeout");Zj(this.g,"setInterval");a=this.g;b=w.window||w.globalThis;c=["requestAnimationFrame","mozRequestAnimationFrame","webkitAnimationFrame","msRequestAnimationFrame"];for(var d=0;d0;)f=" "+f;d.call(c,"[",f,"s] ");c.push("[",b.j(),"] ");c.push(b.getMessage());a.l&&(b=b.g(),b!==void 0&&c.push("\n",b instanceof -Error?b.message:String(b)));a.g&&c.push("\n");return c.join("")};function tk(a){a=a===void 0?new uk:a;Z.call(this);var b=this;this.O={};this.g=null;this.l={};this.M=new ui(this);this.Ra=a.G;this.R=a.K;this.Ha=a.D;this.Oa=a.v;this.Ia=a.M;var c=a.j;this.Fa=Jj({xa:a.H});this.Na=a.P;this.S=new Kh;var d=new ak;vk(this,c);this.A=new Ei(d,c,void 0,void 0,void 0);Df(this,this.A);this.o=a.g?a.g:Tg(c,"docs-sup")+Tg(c,"docs-jepp")+"/jserror";if(d=Tg(c,"jobset"))this.o=V(this.o,"jobset",d);if(d=Tg(c,"docs-ci"))this.o=V(this.o,"id",d);d=Tg(c,"docs-pid");Pg(c.get("docs-eaotx"))&& -d&&(this.o=V(this.o,"ouid",d));this.ca=Sg(c,"docs-srmoe")||0;this.Ka=Pg(c.get("docs-oesf"));this.da=Sg(c,"docs-srmour")||0;this.Ma=Pg(c.get("docs-oursf"));d=a.o||this.da>0&&Math.random()0&&Math.random()0&&Math.random()0&&Math.random()0){var d=new rk,e="";rf(function(g){e+=sk(d,g)});b.clientLog=e}c=b.severity||"fatal";this.Na||(c=Fj(this.Fa,a,c,b));this.ba&&(b.reportName=this.ba+"_"+c);b.isArrayPrototypeIntact=Hi().toString();if(!("WorkerGlobalScope"in w&&self instanceof w.WorkerGlobalScope)){try{var f=!!document.getElementById("docs-editor")}catch(g){f=!1}b.isEditorElementAttached=f.toString()}b.documentCharacterSet= -document.characterSet;b.origin=String(w.origin);f=a.stack||"";if(f.trim().length==0||f=="Not available")b["stacklessError-reportingStack"]=gf(tk.prototype.U),[a.message].concat(pa(Object.keys(b)),pa(Object.values(b))).some(function(g){return g&&g.includes("");this.D&&!this.N?(this.H=this.v,c=="fatal"?c="postmortem":c=="incident"&&(c="warningafterdeath")):c=="fatal"&&(this.D=!0);this.v=!1;b.severity=c}; -tk.prototype.L=function(){zk=!1;if(this.K)for(var a=this.K,b=v(a.et),c=b.next();!c.done;c=b.next()){c=c.value;var d=Nj(a.el,c);if(d&&(Sa(d,a.Pa),!d.length)){d=a.el;var e=Ja(d.getAttribute("jsaction")||"");c+=":.CLIENT";e=e.replace(c+";","");e=e.replace(c,"");Rj(d,e)}}Cf(this.M,this.g,this.A);Z.prototype.L.call(this)};var zk=!1,Ak=null;function uk(){this.K=this.j=void 0;this.v=this.M=this.G=!1;this.g=void 0;this.D=this.l=!1;this.A=!0;this.J=[];this.P=this.o=!1;this.H=[]} -function Ck(a,b){a instanceof He&&(a=a.g);eb(a,"severity",b)};function Fk(a,b){Z.call(this);this.U=a;this.N=b;this.K=void 0;this.status=this.readyState=0;this.responseType=this.o=this.l=this.statusText="";this.onreadystatechange=null;this.M=new Headers;this.v=null;this.R="GET";this.S="";this.g=!1;this.O=this.A=this.D=null;this.H=new AbortController}z(Fk,Z);p=Fk.prototype;p.open=function(a,b){if(this.readyState!=0)throw this.abort(),Error("Error reopening a connection");this.R=a;this.S=b;this.readyState=1;Gk(this)}; -p.send=function(a){if(this.readyState!=1)throw this.abort(),Error("need to call open() first. ");if(this.H.signal.aborted)throw this.abort(),Error("Request was aborted.");this.g=!0;var b={headers:this.M,method:this.R,credentials:this.K,cache:void 0,signal:this.H.signal};a&&(b.body=a);(this.U||w).fetch(new Request(this.S,b)).then(this.Za.bind(this),this.ia.bind(this))}; -p.abort=function(){this.l=this.o="";this.M=new Headers;this.status=0;this.H.abort("Request was aborted.");this.A&&this.A.cancel("Request was aborted.").catch(n());this.readyState>=1&&this.g&&this.readyState!=4&&(this.g=!1,Hk(this));this.readyState=0}; -p.Za=function(a){if(this.g&&(this.D=a,this.v||(this.status=this.D.status,this.statusText=this.D.statusText,this.v=a.headers,this.readyState=2,Gk(this)),this.g&&(this.readyState=3,Gk(this),this.g)))if(this.responseType==="arraybuffer")a.arrayBuffer().then(this.Xa.bind(this),this.ia.bind(this));else if(typeof w.ReadableStream!=="undefined"&&"body"in a){this.A=a.body.getReader();if(this.N){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.l= -[]}else this.l=this.o="",this.O=new TextDecoder;Ik(this)}else a.text().then(this.Ya.bind(this),this.ia.bind(this))};function Ik(a){a.A.read().then(a.Wa.bind(a)).catch(a.ia.bind(a))}p.Wa=function(a){if(this.g){if(this.N&&a.value)this.l.push(a.value);else if(!this.N){var b=a.value?a.value:new Uint8Array(0);if(b=this.O.decode(b,{stream:!a.done}))this.l=this.o+=b}a.done?Hk(this):Gk(this);this.readyState==3&&Ik(this)}};p.Ya=function(a){this.g&&(this.l=this.o=a,Hk(this))}; -p.Xa=function(a){this.g&&(this.l=a,Hk(this))};p.ia=function(){this.g&&Hk(this)};function Hk(a){a.readyState=4;a.D=null;a.A=null;a.O=null;Gk(a)}p.setRequestHeader=function(a,b){this.M.append(a,b)};p.getResponseHeader=function(a){return this.v?this.v.get(a.toLowerCase())||"":""};p.getAllResponseHeaders=function(){if(!this.v)return"";for(var a=[],b=this.v.entries(),c=b.next();!c.done;)c=c.value,a.push(c[0]+": "+c[1]),c=b.next();return a.join("\r\n")}; -function Gk(a){a.onreadystatechange&&a.onreadystatechange.call(a)}Object.defineProperty(Fk.prototype,"withCredentials",{get:function(){return this.K==="include"},set:function(a){this.K=a?"include":"same-origin"}});function Jk(a){this.g=null;this.j=a<1;this.l=a<.01}function Kk(a,b){var c=c===void 0?{}:c;a.l&&(c.sampling_samplePercentage=(.01).toString(),a.g.info(b,c))}function Lk(a,b,c){c=c===void 0?{}:c;a.j&&(c.sampling_samplePercentage=(1).toString(),Ek(a.g,b,c))};function Mk(a){this.C=G(a,void 0,void 0,2048)}u(Mk,J);Mk.prototype.getMessage=function(){return bd(this,1)};function Nk(a){this.C=G(a,void 0,void 0,2048)}u(Nk,J);function Ok(){var a=new Nk;return ed(a,2,Date.now().toString())};function Pk(a){this.C=G(a,void 0,void 0,2048)}u(Pk,J);function Qk(a){this.C=G(a,void 0,void 0,2048)}u(Qk,J);function Rk(a){this.C=G(a,void 0,void 0,2048)}u(Rk,J);var Sk=hd(Rk);function Tk(a){this.C=G(a,void 0,void 0,2048)}u(Tk,J);function Uk(a){this.C=G(a,void 0,void 0,2048)}u(Uk,J);function Vk(a,b){return Kc(a,1,b==null?b:dc(b))}Uk.prototype.qa=function(){return Wc(this,Mk,5)};function Wk(a,b){this.j=b;this.g=a}function Xk(a,b){var c=b.g;c&&c.data&&c.ports&&c.ports.length?(b=c.data?Sk(JSON.stringify(c.data)):new Rk,Yk(a,b,c.ports.length>1?c.ports[1]:void 0).then(function(d){c.ports[0].postMessage(xc(d))})):Lk(a.g,Error("Dropped invalid event."),{event:String(b)})}function Yk(a,b,c){return $f().then(function(){return a.j(b,c)}).oa(function(d){d=d instanceof Error?d:Error(d);var e=new Uk,f=new Mk;Yc(e,Mk,5,f);ed(f,1,d.message);return e})};function Zk(a){this.C=G(a,void 0,void 0,2048)}u(Zk,J);function $k(a,b){return Kc(a,1,b==null?b:dc(b))}Zk.prototype.qa=function(){return Wc(this,Mk,3)};function al(a){var b=eg();chrome.runtime.sendMessage(xc(a),void 0,function(c){return bl(b,function(d){return new Zk(d)},c)});return b.promise.Ca(function(c){c=ff(c);eb(c,"offscreenDocumentRequestType",cd(a,1).toString());throw c;})} -function bl(a,b,c){var d=chrome.runtime;c!==void 0?(d=b(c),d.qa()?(b=a.reject,c=Error,d=d.qa(),d=dd(d,1),b.call(a,c("Error from Offscreen page:"+d))):a.resolve(d)):a.reject(Error("No response from Offscreen page:"+(d.lastError?d.lastError.message:"without lastError")))};function cl(a){a=a===null?"null":a===void 0?"undefined":a;var b;Xe===void 0&&(Xe=Ye());a=(b=Xe)?b.createScriptURL(a):a;return new Ze(a)};function dl(a){W.call(this);this.g=this.A=null;this.v=eg();this.o=!1;this.l=0;this.D=null;this.j=new Jk(a)}u(dl,W);function el(a){w.clearTimeout(a.l);a.g&&(a.o&&(a.v=eg(),a.o=!1),a.g.parentNode&&a.g.parentNode.removeChild(a.g),a.g=null);return Promise.resolve()}function fl(a,b){return a.g?Promise.resolve():gl(a,b)} -function gl(a,b){b||Kk(a.j,Error("Creating extension frame without an OUID."));var c=hl(a,b);return el(a).then(function(){a.g=Qi("IFRAME");a.g.id="extensionFrame";$e(a.g,cl(c));document.body.appendChild(a.g);a.l=oi(function(){Lk(a.j,Error("Timed out waiting for frame connection."));return cg([pi(),yi(a.A.A)]).then(function(){w.close()})},14E3);return Promise.resolve()})}function hl(a,b){return uh(a.D,"/offline/extension/frame").toString()+"?ouid="+(b?encodeURIComponent(String(b)):"")} -function il(a,b){return Promise.resolve(a.v.promise).then(function(c){var d=new MessageChannel;return(new Promise(function(e){d.port1.onmessage=function(f){e(new Tk(f.data))};c.postMessage(xc(b),[d.port2])})).finally(function(){d.port1.close()})})}dl.prototype.L=function(){el(this);W.prototype.L.call(this)};function jl(a){this.C=G(a,void 0,void 0,2048)}u(jl,J);function kl(a){this.C=G(a,void 0,void 0,2048)}u(kl,J);function ll(a){var b=new kl;return Kc(b,1,a==null?a:dc(a))}function ml(a){var b=ll(3);return Yc(b,Nk,4,a)}function nl(a,b){return Yc(a,Qk,6,b)};function ol(){W.call(this);var a=this;this.l=null;this.j=this.g=0;chrome.runtime.onConnectExternal.addListener(function(b){return pl(a,b)});ql(this)}u(ol,W);function pl(a,b){a.g++;w.clearTimeout(a.j);b.onDisconnect.addListener(function(){a.g--;a.g==0&&rl(a)})}function rl(a){a.g==0&&(w.clearTimeout(a.j),a.j=oi(function(){a.g==0&&w.close()},6E4))}function ql(a){oi(function(){a.l&&Ek(a.l,ff("Force closed the offscreen document after one hour."));w.close()},36E5)};function sl(){x(this.l,this);this.g=new rk;this.g.j=!1;this.g.l=!1;this.j=this.g.g=!1;this.o={}}function tl(a){1!=a.j&&(a.j=!0)}sl.prototype.l=function(a){function b(f){if(f){if(f.value>=mf.value)return"error";if(f.value>=nf.value)return"warn";if(f.value>=of.value)return"log"}return"debug"}if(!this.o[a.j()]){var c=sk(this.g,a),d=ul;if(d){var e=b(a.o());vl(d,e,c,a.g())}}};var ul=w.console;function vl(a,b,c,d){if(a[b])a[b](c,d===void 0?"":d);else a.log(c,d===void 0?"":d)};function wl(){W.call(this);var a=this,b=new rh(self.location);this.U=xl(b,"sessionId",function(c){return String(c)},Ke());this.g=this.j=this.M=null;this.l=new ol;rl(this.l);this.N=new sl;tl(this.N);this.K=new ui(this);Df(this,this.K);this.K.listen(w,"message",this.R);this.H=xl(b,"randomPercentageForSampling",function(c){return Number(c)},Math.random()*100);this.P=this.H<1;this.o=new Jk(this.H);this.A="unknown";this.D=null;this.v="unknown";this.O=new Wk(this.o,function(c,d){return yl(a,c,d)});chrome.runtime.onMessage.addListener(this.S.bind(this))} -u(wl,W);wl.prototype.R=function(a){Xk(this.O,a)};function yl(a,b,c){var d=Vk(new Uk,ec(H(b,1)));switch(ec(H(b,1,void 0,Ic))){case 1:b=(b=Wc(b,Nk,7))?dd(b,1):null;var e=Ok();b?ed(e,1,b):Kk(a.o,Error("Scheduler frame connect request sent without an ouid."));b=ml(e);return al(b).then(function(){var f=a.g;f.v.resolve(c);f.o=!0;w.clearTimeout(f.l)}).then(function(){return d});case 3:return b=nl(ll(7),Wc(b,Qk,3)),al(b).then(function(){return d})}throw Error("Dropped unknown message "+b);} -wl.prototype.S=function(a,b,c){var d=this;w.clearTimeout(this.l.j);var e=new kl(a);zl(this,e).then(function(f){c(xc(f))}).catch(function(f){var g=f instanceof Error?f:Error(f);f=new Mk;ed(f,1,g.message);g=$k(new Zk,ec(H(e,1)));Yc(g,Mk,3,f);c(xc(g))}).finally(function(){rl(d.l)});return!0}; -function zl(a,b){var c=$k(new Zk,ec(H(b,1)));try{switch(ec(H(b,1,void 0,Ic))){case 1:return Al(a,b),gl(a.g,a.D).then(function(){return c});case 4:return il(a.g,Wc(b,Pk,5)).then(function(d){Yc(c,Tk,4,d);return c});case 5:return el(a.g).then(function(){return c});case 6:return Al(a,b),fl(a.g,a.D).then(function(){return c});default:throw Error("Dropped unknown message");}}catch(d){return Promise.reject(d)}} -function Al(a,b){if(!a.g){b=Wc(b,jl,2);a.D=dd(b,1);a.M=dd(b,2);var c;a.A=(c=mc(H(b,4)))!=null?c:a.A;var d;a.v=(d=mc(H(b,3)))!=null?d:a.v;c=new rh(a.M);var e=uh(c,"/offline/jserror").toString();d=a.P;b=a.U;var f=f===void 0?!1:f;var g=g===void 0?Mg():g;var h=new uk;h.G=!1;h.v=!0;h.g=e;h.l=f;h.j=g;h.o=!1;f=new tk(h);f.l.sessionTypeName="offline-off-screen-document";f.l.reportsNonFatalErrors=String(d);f.l.sid=b;f.l.extensionVersion=a.v;f.l.optInStatus=a.A;a.j=f;Df(a,a.j);a.o.g=a.j;a.l.l=a.j;a.g=new dl(a.H, -"OffscreenDocument");f=a.g;g=a.j;f.A=g;f.j.g=g;a.g.D=c;Df(a,a.g)}}function xl(a,b,c,d){a=a.l.ha(b);return a.length!=0?c(a[0]):d};new wl; +'use strict';function aa(){return function(a){return a}}function n(){return function(){}}function ba(a){return function(){return this[a]}}function ca(a){return function(){return a}}var p,da=typeof Object.create=="function"?Object.create:function(a){function b(){}b.prototype=a;return new b},ea=typeof Object.defineProperties=="function"?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a}; +function fa(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b>>0)+"_",e=0;return b}); +q("Symbol.iterator",function(a){if(a)return a;a=Symbol("Symbol.iterator");ea(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return qa(oa(this))}});return a});function qa(a){a={next:a};a[Symbol.iterator]=function(){return this};return a} +q("Promise",function(a){function b(g){this.g=0;this.l=void 0;this.j=[];this.J=!1;var h=this.o();try{g(h.resolve,h.reject)}catch(k){h.reject(k)}}function c(){this.g=null}function d(g){return g instanceof b?g:new b(function(h){h(g)})}if(a)return a;c.prototype.j=function(g){if(this.g==null){this.g=[];var h=this;this.l(function(){h.v()})}this.g.push(g)};var e=ha.setTimeout;c.prototype.l=function(g){e(g,0)};c.prototype.v=function(){for(;this.g&&this.g.length;){var g=this.g;this.g=[];for(var h=0;h=f}}); +function ua(a,b){a instanceof String&&(a+="");var c=0,d=!1,e={next:function(){if(!d&&c>>16&65535)*e+d*(c>>>16&65535)<<16>>>0)|0}}); +q("String.prototype.repeat",function(a){return a?a:function(b){var c=ta(this,null,"repeat");if(b<0||b>1342177279)throw new RangeError("Invalid count value");b|=0;for(var d="";b;)if(b&1&&(d+=c),b>>>=1)c+=c;return d}}); +q("String.prototype.matchAll",function(a){return a?a:function(b){if(b instanceof RegExp&&!b.global)throw new TypeError("RegExp passed into String.prototype.matchAll() must have global tag.");var c=new RegExp(b,b instanceof RegExp?void 0:"g"),d=this,e=!1,f={next:function(){if(e)return{value:void 0,done:!0};var g=c.exec(d);if(!g)return e=!0,{value:void 0,done:!0};g[0]===""&&(c.lastIndex+=1);return{value:g,done:!1}}};f[Symbol.iterator]=function(){return f};return f}}); +q("Promise.prototype.finally",function(a){return a?a:function(b){return this.then(function(c){return Promise.resolve(b()).then(function(){return c})},function(c){return Promise.resolve(b()).then(function(){throw c;})})}});/* + + Copyright The Closure Library Authors. + SPDX-License-Identifier: Apache-2.0 +*/ +var va=va||{},w=this||self;function wa(a,b){var c=xa("CLOSURE_FLAGS");a=c&&c[a];return a!=null?a:b}function xa(a){a=a.split(".");for(var b=w,c=0;c>>0),Ca=0; +function Da(a,b,c){return a.call.apply(a.bind,arguments)}function Ea(a,b,c){if(!a)throw Error();if(arguments.length>2){var d=Array.prototype.slice.call(arguments,2);return function(){var e=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(e,d);return a.apply(b,e)}}return function(){return a.apply(b,arguments)}}function x(a,b,c){x=Function.prototype.bind&&Function.prototype.bind.toString().indexOf("native code")!=-1?Da:Ea;return x.apply(null,arguments)} +function Fa(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function Ga(a){(0,eval)(a)}function Ha(a){return a}function z(a,b){function c(){}c.prototype=b.prototype;a.T=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.cc=function(d,e,f){for(var g=Array(arguments.length-2),h=2;h0:!1};function Ra(a,b){return Array.prototype.some.call(a,b,void 0)}function Sa(a,b){b=Array.prototype.indexOf.call(a,b,void 0);var c;(c=b>=0)&&Array.prototype.splice.call(a,b,1);return c}function Ta(a,b){for(var c=1;c=b||(d[a]=c+1,a=Error(),eb(a,"severity","incident"),Ia(a))}};function ib(){return typeof BigInt==="function"};var jb=typeof Symbol==="function"&&typeof Symbol()==="symbol";function kb(a,b,c){return typeof Symbol==="function"&&typeof Symbol()==="symbol"?(c===void 0?0:c)&&Symbol.for&&a?Symbol.for(a):a!=null?Symbol(a):Symbol():b}var lb=kb("jas",void 0,!0),mb=kb(void 0,"0di"),nb=kb(void 0,"1oa"),ob=kb(void 0,Symbol()),pb=kb(void 0,"0ubs"),qb=kb(void 0,"0actk"),rb=kb("m_m","fc",!0);Math.max.apply(Math,pa(Object.values({Gb:1,Eb:2,Bb:4,Pb:8,Yb:16,Lb:32,nb:64,zb:128,xb:256,Vb:512,yb:1024,Ab:2048,Mb:4096,Hb:8192})));var sb={bb:{value:0,configurable:!0,writable:!0,enumerable:!1}},tb=Object.defineProperties,C=jb?lb:"bb",ub,vb=[];D(vb,7);ub=Object.freeze(vb);function wb(a,b){jb||C in a||tb(a,sb);a[C]|=b}function D(a,b){jb||C in a||tb(a,sb);a[C]=b}function xb(a){wb(a,34);return a};var yb={};function zb(a,b){return b===void 0?a.g!==Ab&&!!(2&(a.C[C]|0)):!!(2&b)&&a.g!==Ab}var Ab={},Bb=Object.freeze({});function Cb(a){a.ec=!0;return a};var Db=Cb(function(a){return typeof a==="number"}),Eb=Cb(function(a){return typeof a==="string"}),Fb=Cb(function(a){return typeof a==="boolean"}),Gb=Cb(function(a){return typeof a==="bigint"});var Hb=typeof w.BigInt==="function"&&typeof w.BigInt(0)==="bigint";function Ib(a){var b=a;if(Eb(b)){if(!/^\s*(?:-?[1-9]\d*|0)?\s*$/.test(b))throw Error(String(b));}else if(Db(b)&&!Number.isSafeInteger(b))throw Error(String(b));return Hb?BigInt(a):a=Fb(a)?a?"1":"0":Eb(a)?a.trim()||"0":String(a)} +var Jb=Cb(function(a){return Hb?Gb(a):Eb(a)&&/^(?:-?[1-9]\d*|0)$/.test(a)}),Pb=Cb(function(a){return Hb?a>=Kb&&a<=Lb:a[0]==="-"?Mb(a,Nb):Mb(a,Ob)}),Nb=Number.MIN_SAFE_INTEGER.toString(),Kb=Hb?BigInt(Number.MIN_SAFE_INTEGER):void 0,Ob=Number.MAX_SAFE_INTEGER.toString(),Lb=Hb?BigInt(Number.MAX_SAFE_INTEGER):void 0;function Mb(a,b){if(a.length>b.length)return!1;if(a.lengthe)return!1;if(d>>0;E=b;F=(a-b)/4294967296>>>0}function Rb(a){if(a<0){Qb(0-a);var b=v(Sb(E,F));a=b.next().value;b=b.next().value;E=a>>>0;F=b>>>0}else Qb(a)}function Tb(a,b){b>>>=0;a>>>=0;if(b<=2097151)var c=""+(4294967296*b+a);else ib()?c=""+(BigInt(b)<>>24|b<<8)&16777215,b=b>>16&65535,a=(a&16777215)+c*6777216+b*6710656,c+=b*8147497,b*=2,a>=1E7&&(c+=a/1E7>>>0,a%=1E7),c>=1E7&&(b+=c/1E7>>>0,c%=1E7),c=b+Ub(c)+Ub(a));return c} +function Ub(a){a=String(a);return"0000000".slice(a.length)+a}function Vb(){var a=E,b=F;b&2147483648?ib()?a=""+(BigInt(b|0)<>>0)):(b=v(Sb(a,b)),a=b.next().value,b=b.next().value,a="-"+Tb(a,b)):a=Tb(a,b);return a}function Sb(a,b){b=~b;a?a=~a+1:b+=1;return[a,b]};var Wb=typeof BigInt==="function"?BigInt.asIntN:void 0,Xb=Number.isSafeInteger,Yb=Number.isFinite,Zb=Math.trunc;function $b(a){if(a==null||typeof a==="number")return a;if(a==="NaN"||a==="Infinity"||a==="-Infinity")return Number(a)}function ac(a){return a.displayName||a.name||"unknown type name"}var bc=/^-?([1-9][0-9]*|0)(\.[0-9]+)?$/;function cc(a){switch(typeof a){case "bigint":return!0;case "number":return Yb(a);case "string":return bc.test(a);default:return!1}} +function dc(a){if(!Yb(a))throw a=Error("enum"),eb(a,"severity","warning"),a;return a|0}function ec(a){return a==null?a:Yb(a)?a|0:void 0}function fc(a){if(a==null)return a;if(typeof a==="string"&&a)a=+a;else if(typeof a!=="number")return;return Yb(a)?a|0:void 0} +function hc(a){var b=a.length;if(a[0]==="-"?b<20||b===20&&a<="-9223372036854775808":b<19||b===19&&a<="9223372036854775807")return a;if(a.length<16)Rb(Number(a));else if(ib())a=BigInt(a),E=Number(a&BigInt(4294967295))>>>0,F=Number(a>>BigInt(32)&BigInt(4294967295));else{b=+(a[0]==="-");F=E=0;for(var c=a.length,d=0+b,e=(c-b)%6+b;e<=c;d=e,e+=6)d=Number(a.slice(d,e)),F*=1E6,E=E*1E6+d,E>=4294967296&&(F+=Math.trunc(E/4294967296),F>>>=0,E>>>=0);b&&(b=v(Sb(E,F)),a=b.next().value,b=b.next().value,E=a,F=b)}return Vb()} +function ic(a){cc(a);a=Zb(a);if(!Xb(a)){Rb(a);var b=E,c=F;if(a=c&2147483648)b=~b+1>>>0,c=~c>>>0,b==0&&(c=c+1>>>0);var d=c*4294967296+(b>>>0);b=Number.isSafeInteger(d)?d:Tb(b,c);a=typeof b==="number"?a?-b:b:a?"-"+b:b}return a}function jc(a){cc(a);a=Zb(a);Xb(a)?a=String(a):(Rb(a),a=Vb());return a} +function kc(a,b){b=b===void 0?!1:b;var c=typeof a;if(a==null)return a;if(c==="bigint")return String(Wb(64,a));if(cc(a))return c==="string"?(cc(a),b=Zb(Number(a)),Xb(b)?a=String(b):(b=a.indexOf("."),b!==-1&&(a=a.substring(0,b)),a=hc(a))):a=b?jc(a):ic(a),a} +function lc(a){var b=typeof a;if(a==null)return a;if(b==="bigint")return Ib(Wb(64,a));if(cc(a))return b==="string"?(b=Zb(Number(a)),Xb(b)?a=Ib(b):(b=a.indexOf("."),b!==-1&&(a=a.substring(0,b)),a=ib()?Ib(Wb(64,BigInt(a))):Ib(hc(a)))):a=Xb(a)?Ib(ic(a)):Ib(jc(a)),a}function mc(a){return a==null||typeof a==="string"?a:void 0}function nc(a,b,c,d){if(a!=null&&a[rb]===yb)return a;if(!Array.isArray(a))return c?d&2?b[mb]||(b[mb]=oc(b)):new b:void 0;c=a[C]|0;d=c|d&32|d&2;d!==c&&D(a,d);return new b(a)} +function oc(a){a=new a;xb(a.C);return a};function pc(a){return a};function qc(){}function rc(a,b){for(var c in a)!isNaN(c)&&b(a,+c,a[c])}function sc(a){var b=new qc;rc(a,function(c,d,e){b[d]=Array.prototype.slice.call(e)});b.g=a.g;return b}function tc(a,b){b<100||hb(pb,1)};function uc(a,b,c,d){var e=d!==void 0;d=!!d;var f=Ha(ob),g;!e&&jb&&f&&(g=a[f])&&rc(g,tc);f=[];var h=a.length;g=4294967295;var k=!1,l=!!(b&64),m=l?b&128?0:-1:void 0;if(!(b&1)){var t=h&&a[h-1];t!=null&&typeof t==="object"&&t.constructor===Object?(h--,g=h):t=void 0;if(l&&!(b&128)&&!e){k=!0;var r;g=((r=vc)!=null?r:pc)(g-m,m,a,t,void 0)+m}}b=void 0;for(r=0;r=g){var I=r-m,N=void 0;((N=b)!=null?N:b={})[I]=y}else f[r]=y}if(t)for(var ja in t)h=t[ja], +h!=null&&(h=c(h,d))!=null&&(r=+ja,y=void 0,l&&!Number.isNaN(r)&&(y=r+m)>2];l=c[(l&3)<<4|m>>4];m=c[(m&15)<<2|k>>6];k=c[k&63];d[f++]=""+h+l+m+k}h=0;k=e;switch(b.length-g){case 2:h= +b[g+1],k=c[(h&15)<<2]||e;case 1:b=b[g],d[f]=""+c[b>>2]+c[(b&3)<<4|h>>4]+k+e}b=d.join("")}a=a.g=b}return a}return}return a}var yc=ab?structuredClone:function(a){return uc(a,0,wc)},vc;function xc(a){a=a.C;return uc(a,a[C]|0,wc)};function G(a,b,c,d){d=d===void 0?0:d;if(a==null){var e=32;c?(a=[c],e|=128):a=[];b&&(e=e&-16760833|(b&1023)<<14)}else{if(!Array.isArray(a))throw Error("narr");e=a[C]|0;if(La&&1&e)throw Error("rfarr");2048&e&&!(2&e)&&zc();if(e&256)throw Error("farr");if(e&64)return(e|d)!==e&&D(a,e|d),a;if(c&&(e|=128,c!==a[0]))throw Error("mid");a:{c=a;e|=64;var f=c.length;if(f){var g=f-1,h=c[g];if(h!=null&&typeof h==="object"&&h.constructor===Object){b=e&128?0:-1;g-=b;if(g>=1024)throw Error("pvtlmt");for(var k in h)f= ++k,f1024)throw Error("spvt");e=e&-16760833|(k&1023)<<14}}}D(a,e|64|d);return a}function zc(){if(La)throw Error("carr");hb(qb,5)};function Ac(a,b){if(typeof a!=="object")return a;if(Array.isArray(a)){var c=a[C]|0;a.length===0&&c&1?a=void 0:c&2||(!b||4096&c||16&c?a=Bc(a,c,!1,b&&!(c&16)):(wb(a,34),c&4&&Object.freeze(a)));return a}if(a!=null&&a[rb]===yb)return b=a.C,c=b[C]|0,zb(a,c)?a:Cc(a,b,c)?Dc(a,b):Bc(b,c);if(a instanceof bb)return a}function Dc(a,b,c){a=new a.constructor(b);c&&(a.g=Ab);a.j=Ab;return a}function Bc(a,b,c,d){d!=null||(d=!!(34&b));a=uc(a,b,Ac,d);d=32;c&&(d|=2);b=b&16769217|d;D(a,b);return a} +function Ec(a){var b=a.C,c=b[C]|0;return zb(a,c)?Cc(a,b,c)?Dc(a,b,!0):new a.constructor(Bc(b,c,!1)):a}function Fc(a){if(a.g!==Ab)return!1;var b=a.C;b=Bc(b,b[C]|0);wb(b,2048);a.C=b;a.g=void 0;a.j=void 0;return!0}function Gc(a,b){b===void 0&&(b=a[C]|0);b&32&&!(b&4096)&&D(a,b|4096)}function Cc(a,b,c){return c&2?!0:c&32&&!(c&4096)?(D(b,c|2),a.g=Ab,!0):!1};var Hc=Ib(0),Ic={};function H(a,b,c,d,e){Object.isExtensible(a);b=Jc(a.C,b,c,e);if(b!==null||d&&a.j!==Ab)return b}function Jc(a,b,c,d){if(b===-1)return null;var e=b+(c?0:-1),f=a.length-1;if(!(f<1+(c?0:-1))){if(e>=f){var g=a[f];if(g!=null&&typeof g==="object"&&g.constructor===Object){c=g[b];var h=!0}else if(e===f)c=g;else return}else c=a[e];if(d&&c!=null){d=d(c);if(d==null)return d;if(!Object.is(d,c))return h?g[b]=d:a[e]=d,d}return c}} +function Kc(a,b,c){if(!Fc(a)&&zb(a,a.C[C]|0))throw Error();var d=a.C;Lc(d,d[C]|0,b,c);return a}function Lc(a,b,c,d){var e=c+-1,f=a.length-1;if(f>=0&&e>=f){var g=a[f];if(g!=null&&typeof g==="object"&&g.constructor===Object)return g[c]=d,b}if(e<=f)return a[e]=d,b;if(d!==void 0){var h;f=((h=b)!=null?h:b=a[C]|0)>>14&1023||536870912;c>=f?d!=null&&(e={},a[f+-1]=(e[c]=d,e)):a[e]=d}return b} +function Mc(a,b,c,d,e,f,g,h){var k=b;f===1||(f!==4?0:2&b||!(16&b)&&32&d)?Nc(b)||(b|=!a.length||g&&!(4096&b)||32&d&&!(4096&b||16&b)?2:256,b!==k&&D(a,b),Object.freeze(a)):(f===2&&Nc(b)&&(a=Array.prototype.slice.call(a),k=0,b=Oc(b,d),d=Lc(c,d,e,a)),Nc(b)||(h||(b|=16),b!==k&&D(a,b)));2&b||!(4096&b||16&b)||Gc(c,d);return a}function Pc(a,b){a=Jc(a,b);return Array.isArray(a)?a:ub}function Qc(a,b){2&b&&(a|=2);return a|1}function Nc(a){return!!(2&a)&&!!(4&a)||!!(256&a)} +function Rc(a){return a==null?a:typeof a==="string"?a?new bb(a,$a):cb():a.constructor===bb?a:Ya&&a!=null&&a instanceof Uint8Array?a.length?new bb(new Uint8Array(a),$a):cb():void 0}function Sc(a,b,c){return Tc(a,b)===c?c:-1} +function Tc(a,b){a=a.C;if(jb){var c;var d=(c=a[nb])!=null?c:a[nb]=new Map}else nb in a?d=a[nb]:(c=new Map,Object.defineProperty(a,nb,{value:c}),d=c);c=d;d=void 0;var e=c.get(b);if(e==null){for(var f=e=0;f>>0)}p=ud.prototype;p.isSafeInteger=function(){var a=this.F>>21;return a==0||a==-1&&!(this.I==0&&this.F==-2097152)}; +p.toString=function(a){a=a||10;if(a<2||36>2);var c=Math.pow(a,b),d=K(c,c/4294967296);c=this.div(d);var e=Math,f=e.abs;d=c.multiply(d);d=this.add(wd(d));e=f.call(e,vd(d));f=a==10?""+e:e.toString(a);f.length>>0>a.I>>>0?1:-1:this.F>a.F?1:-1};function wd(a){var b=~a.I+1|0;return K(b,~a.F+!b|0)}p.add=function(a){var b=this.F>>>16,c=this.F&65535,d=this.I>>>16,e=a.F>>>16,f=a.F&65535,g=a.I>>>16;a=(this.I&65535)+(a.I&65535);g=(a>>>16)+(d+g);d=g>>>16;d+=c+f;return K((g&65535)<<16|a&65535,((d>>>16)+(b+e)&65535)<<16|d&65535)}; +p.multiply=function(a){if(xd(this))return this;if(xd(a))return a;var b=this.F>>>16,c=this.F&65535,d=this.I>>>16,e=this.I&65535,f=a.F>>>16,g=a.F&65535,h=a.I>>>16;a=a.I&65535;var k=e*a;var l=(k>>>16)+d*a;var m=l>>>16;l=(l&65535)+e*h;m+=l>>>16;m+=c*a;var t=m>>>16;m=(m&65535)+d*h;t+=m>>>16;m=(m&65535)+e*g;t=t+(m>>>16)+(b*a+c*h+d*g+e*f)&65535;return K((l&65535)<<16|k&65535,t<<16|m&65535)}; +p.div=function(a){if(xd(a))throw Error("division by zero");if(this.F<0){if(this.equals(yd)){if(a.equals(zd)||a.equals(Ad))return yd;if(a.equals(yd))return zd;var b=this.F;b=K(this.I>>>1|b<<31,b>>1);b=b.div(a).shiftLeft(1);if(b.equals(Bd))return a.F<0?zd:Ad;var c=a.multiply(b);c=this.add(wd(c));return b.add(c.div(a))}return a.F<0?wd(this).div(wd(a)):wd(wd(this).div(a))}if(xd(this))return Bd;if(a.F<0)return a.equals(yd)?Bd:wd(this.div(wd(a)));b=Bd;for(c=this;c.compare(a)>=0;){var d=Math.max(1,Math.floor(vd(c)/ +vd(a))),e=Math.ceil(Math.log(d)/Math.LN2);e=e<=48?1:Math.pow(2,e-48);for(var f=Cd(d),g=f.multiply(a);g.F<0||g.compare(c)>0;)d-=e,f=Cd(d),g=f.multiply(a);xd(f)&&(f=zd);b=b.add(f);c=c.add(wd(g))}return b};p.and=function(a){return K(this.I&a.I,this.F&a.F)};p.or=function(a){return K(this.I|a.I,this.F|a.F)};p.xor=function(a){return K(this.I^a.I,this.F^a.F)};p.shiftLeft=function(a){a&=63;if(a==0)return this;var b=this.I;return a<32?K(b<>>32-a):K(0,b<0?a>=0x7fffffffffffffff?Dd:new ud(a,a/4294967296):a<0?a<=-0x7fffffffffffffff?yd:wd(new ud(-a,-a/4294967296)):Bd}function K(a,b){return new ud(a,b)}var Bd=K(0,0),zd=K(1,0),Ad=K(-1,-1),Dd=K(4294967295,2147483647),yd=K(0,2147483648);function Ed(a,b){b=b===void 0?window:b;b=b===void 0?window:b;return(b=b.WIZ_global_data)&&a in b?b[a]:null};var Fd; +function Gd(){var a=null;var b=Ed("TSDtV",window);if(b=typeof b!=="string"?null:b)a=td("["+b.substring(4)),a=Xc(a,rd,1)[0];if(a){b=v(Xc(a,pd,2));for(var c=b.next();!c.done;c=b.next()){c=c.value;var d=c.C;if(Uc(d,d[C]|0,id,Sc(c,qd,6))!==void 0)throw Error();}}if(a)for(b={},c=v(Xc(a,pd,2)),d=c.next();!d.done;d=c.next()){var e=d.value;d=ad(e,1).toString();switch(Tc(e,qd)){case 3:b[d]=Zc(e,Sc(e,qd,3));break;case 2:var f=ad(e,Sc(e,qd,2));Jb(f);Pb(f);f=Pb(f)?Number(f):String(f);b[d]=f;break;case 4:f=void 0; +var g=e;var h=Sc(e,qd,4);e=void 0;e=e===void 0?0:e;g=(f=H(g,h,void 0,void 0,$b))!=null?f:e;b[d]=g;break;case 5:b[d]=bd(e,Sc(e,qd,5));break;case 6:b[d]=Wc(e,id,Sc(e,qd,6));break;case 8:f=Vc(e,nd,Sc(e,qd,8));switch(Tc(f,od)){case 1:b[d]=bd(f,Sc(f,od,1));break;default:throw Error("case "+Tc(f,od));}break;default:throw Error("case "+Tc(e,qd));}}else b={};this.g=b;this.j=a?a.za():null}Gd.prototype.za=ba("j");function Jd(a){this.C=G(a,void 0,void 0,2048)}u(Jd,J);var Kd=new kd;function Ld(a){this.C=G(a,void 0,void 0,2048)}u(Ld,J);var Md=function(a){return function(){return a[mb]||(a[mb]=oc(a))}}(Ld);Object.create(null);function L(){}L.prototype.equals=function(a){return Nd(this,a)};L.prototype.ra=function(){return this.v||(Object.defineProperties(this,{v:{value:Od=Od+1|0,enumerable:!1}}),this.v)};L.prototype.toString=function(){return M(Pd(O(Qd(this))))+"@"+M((this.ra()>>>0).toString(16))};L.prototype.B=["java.lang.Object",0];function Rd(){}u(Rd,L);function P(a,b){a.g=b;Sd(b,a)}function Q(a){Td(a.g)&&(Error.captureStackTrace?Error.captureStackTrace(R(a.g,Td,Ud)):R(a.g,Td,Ud).stack=Error().stack)}Rd.prototype.toString=function(){var a=Pd(O(Qd(this))),b=this.j;return b==null?a:M(a)+": "+M(b)};function Vd(a){if(a!=null){var b=a.La;if(b!=null)return b}a instanceof TypeError?b=Wd():(b=new Xd,Q(b),P(b,Error(b)));b.j=a==null?"null":a.toString();P(b,a);return b}function Yd(a){return a instanceof Rd} +Rd.prototype.B=["java.lang.Throwable",0];function Zd(){}u(Zd,Rd);Zd.prototype.B=["java.lang.Exception",0];function S(){}u(S,Zd);S.prototype.B=["java.lang.RuntimeException",0];function $d(){}u($d,S);$d.prototype.B=["java.lang.IndexOutOfBoundsException",0];var ae;function be(){be=n();for(var a=ce(),b=0;b<256;b=b+1|0)de(a,b,ee(b-128|0));ae=a};function fe(){}u(fe,S);fe.prototype.B=["java.lang.ArithmeticException",0];function ge(){}u(ge,S);ge.prototype.B=["java.lang.ArrayStoreException",0];function he(){}u(he,S);he.prototype.B=["java.lang.ClassCastException",0];function ie(){}u(ie,S);ie.prototype.B=["java.lang.IllegalArgumentException",0];function je(){}u(je,S);function ke(a){var b=new je;b.j=a;Q(b);P(b,Error(b));return b}je.prototype.B=["java.lang.IllegalStateException",0];function Xd(){}u(Xd,S);Xd.prototype.B=["java.lang.JsException",0];function le(){}u(le,Xd);function Wd(){var a=new le;Q(a);P(a,new TypeError(a));return a}le.prototype.B=["java.lang.NullPointerException",0];function me(){}u(me,$d);me.prototype.B=["java.lang.StringIndexOutOfBoundsException",0];function ne(){}var oe;u(ne,L);ne.prototype.B=["java.lang.Number",0];function pe(){}u(pe,ne);pe.prototype.B=["java.lang.Double",0];function qe(a){return Cd(a)}function re(a){if(!isFinite(a))throw a=new fe,Q(a),P(a,Error(a)),a.g;return a|0};function se(){}u(se,L);se.prototype.B=["java.lang.Boolean",0];function R(a,b,c){if(a!=null&&!b(a))throw a=M(Pd(te(a)))+" cannot be cast to "+M(Pd(O(c))),b=new he,b.j=a,Q(b),P(b,Error(b)),b.g;return a};function Qd(a){return a.constructor}function ue(a,b,c){if(Object.prototype.hasOwnProperty.call(a.prototype,b))return a.prototype[b];c=c();return a.prototype[b]=c};function Nd(a,b){return Object.is(a,b)||a==null&&b==null};var Od=0;function te(a){switch(T(typeof a)){case "number":return O(pe);case "boolean":return O(se);case "string":return O(ve);case "function":return O(we)}if(a instanceof ud)a=O(xe);else if(a instanceof L)a=O(Qd(a));else if(Array.isArray(a))a=(a=a.ma)?O(a.Y,a.X):O(L,1);else if(a!=null)a=O(ye);else throw new TypeError("null.getClass()");return a};function we(){}we.prototype.B=["",1];function ye(){}u(ye,L);ye.prototype.B=["",0];function U(){this.V=0}u(U,ne);function ze(a){a>-129&&a<128?(be(),a=ae[a+128|0]):a=ee(a);return a}function ee(a){var b=new U;b.V=a;return b}U.prototype.equals=function(a){return Ae(a)&&R(a,Ae,U).V==this.V};U.prototype.ra=ba("V");U.prototype.toString=function(){return""+this.V};function Ae(a){return a instanceof U}U.prototype.B=["java.lang.Integer",0];function xe(){}u(xe,ne);xe.prototype.B=["java.lang.Long",0];function Be(){}u(Be,ie);Be.prototype.B=["java.lang.NumberFormatException",0];function T(a){if(a==null)throw Wd().g;return a};function ce(){var a=[256];return Ce(a,{Y:U,la:Ae,X:a.length})}function Ce(a,b){var c=a[0];if(c==null)return null;var d=new globalThis.Array(c);b&&(d.ma=b);if(a.length>1){a=a.slice(1);b=b&&{Y:b.Y,la:b.la,X:b.X-1};for(var e=0;e1){d=e.Y;var f=e.la;e=e.X-1;if(c!=null&&Array.isArray(c)){var g=c.ma||{Y:L,X:1},h=g.X;h==e?(e=g.Y,d=e===d?!0:d&&d.prototype.Ba||e&&e.prototype.Ba?!1:f(e.prototype)):d=h>e?L==d:!1}else d=!1;if(!d){d=!1;break a}}else if(c!=null&&!e.la(c)){d=!1;break a}d=!0}if(!d)throw a=new ge,Q(a),P(a,Error(a)),a.g;a[b]=c};function ve(){}u(ve,L);function M(a){return a==null?"null":a.toString()}function De(a){if(!(a>=0))throw a=new ie,Q(a),P(a,Error(a)),a.g;return"0".repeat(a)}ve.prototype.B=["java.lang.String",0];function Ee(a,b){this.g=a;this.j=b}u(Ee,L);function O(a,b){var c=b||0;return ue(a,"$$class/"+c,function(){return new Ee(a,c)})}function Pd(a){return a.j!=0?M(Fe("[",a.j))+M(a.g.prototype.B[1]==3?a.g.prototype.B[2]:"L"+M(a.g.prototype.B[0])+";"):a.g.prototype.B[0]}function Ge(a,b){b=a.lastIndexOf(b)+1|0;var c=a.length+1|0;if(b<0||b>=c)throw a=new me,a.j="Index: "+b+", Size: "+c,Q(a),P(a,Error(a)),a.g;return a.substr(b)} +Ee.prototype.toString=function(){return String(this.j==0&&this.g.prototype.B[1]==1?"interface ":this.j==0&&this.g.prototype.B[1]==3?"":"class ")+M(Pd(this))};function Fe(a,b){for(var c="",d=0;d>>0).toString(16);b=M(De(Math.max(0,8-b.length|0)))+M(b);a=(a(2147483647)>>>0).toString(16);return M(a)+M(b)};function Le(){}function Me(a){return a instanceof Array}Le.prototype.B=["Array",0];function Ne(){}function Oe(a){return a instanceof Object}Ne.prototype.B=["Object",0];function Pe(){}function Qe(a){return a instanceof Object}Pe.prototype.B=["Object",0];var Re={Ib:"build-label",lb:"buildLabel",mb:"clientLog",qb:"docId",Kb:"mobile-app-version",Ub:"severity",Zb:"severity-unprefixed",Cb:"isArrayPrototypeIntact",Db:"isEditorElementAttached",wb:"documentCharacterSet",Fb:"isModuleLoadFailure",Sb:"reportName",Jb:"locale",ob:"createdOnServer",Ob:"numUnsavedCommands",pb:"cspViolationContext",Rb:"relatedToBrowserExtension",bc:"workerError",rb:"docosPostLimitExceeded",sb:"docosPostLimitType",tb:"docosReactionLimitExceeded",ub:"docosReactionLimitType",Qb:"origin", +Tb:"saveTakingTooLongOnClient",Wb:"truncatedCommentNotificationsCount",Xb:"truncatedCommentNotificationsFromPayload",Nb:"nonfatalReason",ac:"usesModuleSetsServing"};function Se(){this.g=!1}var Te;u(Se,L);p=Se.prototype;p.dispose=function(){if(this.g)var a=null;else this.g=!0,a=this.o==null?Te:this.o,this.o=null;if(a!=null){this.na();if(a.length!=0)for(var b=0;b4);e++)b[ef(a[e])]||(c+="\nInner error "+d++ +": ",a[e].stack&&a[e].stack.indexOf(a[e].toString())==0||(c+=typeof a[e]==="string"?a[e]:a[e].message+"\n"),c+=cf(a[e],b));e=0)c.push("[...circular reference...]");else if(a&&b.length<50){c.push(df(a)+"(");for(var d=a.arguments,e=0;d&&e0&&c.push(", ");var f=d[e];switch(typeof f){case "object":f=f?"object":"null";break;case "string":break;case "number":f=String(f);break;case "boolean":f=f?"true":"false";break;case "function":f=(f=df(f))?f:"[fn]";break;default:f=typeof f}f.length>40&&(f=f.slice(0,40)+"...");c.push(f)}b.push(a);c.push(")\n"); +try{c.push(jf(a.caller,b))}catch(g){c.push("[exception trying to get caller]\n")}}else a?c.push("[...long stack...]"):c.push("[end]");return c.join("")}function df(a){if(kf[a])return kf[a];a=String(a);if(!kf[a]){var b=/function\s+([^\(]+)/m.exec(a);kf[a]=b?b[1]:"[Anonymous]"}return kf[a]}var kf={};function lf(a,b){this.name=a;this.value=b}lf.prototype.toString=ba("name");var mf=new lf("SEVERE",1E3),nf=new lf("WARNING",900),of=new lf("CONFIG",700);function pf(){this.clear()}var qf;function rf(a){var b=sf(),c=b.g;if(c[0]){var d=b.j;b=b.l?d:-1;do b=(b+1)%0,a(c[b]);while(b!==d)}}pf.prototype.clear=function(){this.g=[];this.j=-1;this.l=!1};function sf(){qf||(qf=new pf);return qf};function tf(a,b,c,d,e,f,g){var h="";a&&(h+=a+":");c&&(h+="//",b&&(h+=b+"@"),h+=c,d&&(h+=":"+d));e&&(h+=e);f&&(h+="?"+f);g&&(h+="#"+g);return h}var uf=RegExp("^(?:([^:/?#.]+):)?(?://(?:([^\\\\/?#]*)@)?([^\\\\/?#]*?)(?::([0-9]+))?(?=[\\\\/?#]|$))?([^?#]+)?(?:\\?([^#]*))?(?:#([\\s\\S]*))?$"); +function vf(a,b){if(a){a=a.split("&");for(var c=0;c=0){var f=a[c].substring(0,d);e=a[c].substring(d+1)}else f=a[c];b(f,e?decodeURIComponent(e.replace(/\+/g," ")):"")}}}function wf(a,b){if(!b)return a;var c=a.indexOf("#");c<0&&(c=a.length);var d=a.indexOf("?");if(d<0||d>c){d=c;var e=""}else e=a.substring(d+1,c);a=[a.slice(0,d),e,a.slice(c)];c=a[1];a[1]=b?c?c+"&"+b:b:c;return a[0]+(a[1]?"?"+a[1]:"")+a[2]} +function xf(a,b,c){if(Array.isArray(b))for(var d=0;d0){this.j--;var a=this.g;this.g=a.next;a.next=null}else a=this.l();return a};function Gf(a,b){a.o(b);a.j<100&&(a.j++,b.next=a.g,a.g=b)};var Hf=[],If=[],Jf=!1;function Kf(a){Hf[Hf.length]=a;if(Jf)for(var b=0;b1)));g=g.next)e||(f=g);e&&(c.g==0&&d==1?ig(c,b):(f?(d=f,d.next==c.o&&(c.o=d),d.next=d.next.next):jg(c),kg(c,e,3,b)))}a.l=null}else Wf(a,3,b)}function lg(a,b){a.j||a.g!=2&&a.g!=3||ng(a);a.o?a.o.next=b:a.j=b;a.o=b} +function gg(a,b,c,d){var e=Zf(null,null,null);e.g=new X(function(f,g){e.o=b?function(h){try{var k=b.call(d,h);f(k)}catch(l){g(l)}}:f;e.j=c?function(h){try{var k=c.call(d,h);k===void 0&&h instanceof hg?g(h):f(k)}catch(l){g(l)}}:g});e.g.l=a;lg(a,e);return e.g}p.ib=function(a){this.g=0;Wf(this,2,a)};p.jb=function(a){this.g=0;Wf(this,3,a)}; +function Wf(a,b,c){a.g==0&&(a===c&&(b=3,c=new TypeError("Promise cannot resolve to itself")),a.g=1,bg(c,a.ib,a.jb,a)||(a.J=c,a.g=b,a.l=null,ng(a),b!=3||c instanceof hg||og(a,c)))}function bg(a,b,c,d){if(a instanceof X)return lg(a,Zf(b||Uf,c||null,d)),!0;if(Vf(a))return a.then(b,c,d),!0;if(Aa(a))try{var e=a.then;if(typeof e==="function")return pg(a,e,b,c,d),!0}catch(f){return c.call(d,f),!0}return!1} +function pg(a,b,c,d,e){function f(k){h||(h=!0,d.call(e,k))}function g(k){h||(h=!0,c.call(e,k))}var h=!1;try{b.call(a,g,f)}catch(k){f(k)}}function ng(a){a.G||(a.G=!0,Rf(a.Ua,a))}function jg(a){var b=null;a.j&&(b=a.j,a.j=b.next,b.next=null);a.j||(a.o=null);return b}p.Ua=function(){for(var a;a=jg(this);)kg(this,a,this.g,this.J);this.G=!1}; +function kg(a,b,c,d){if(c==3&&b.j&&!b.v)for(;a&&a.v;a=a.l)a.v=!1;if(b.g)b.g.l=null,qg(b,c,d);else try{b.v?b.o.call(b.l):qg(b,c,d)}catch(e){rg.call(null,e)}Gf(Yf,b)}function qg(a,b,c){b==2?a.o.call(a.l,c):a.j&&a.j.call(a.l,c)}function og(a,b){a.v=!0;Rf(function(){a.v&&rg.call(null,b)})}var rg=Ia;function hg(a){A.call(this,a);this.g=!1}z(hg,A);hg.prototype.name="cancel";function fg(a,b,c){this.promise=a;this.resolve=b;this.reject=c};/* + + Copyright 2005, 2007 Bob Ippolito. All Rights Reserved. + Copyright The Closure Library Authors. + SPDX-License-Identifier: MIT +*/ +function sg(){this.v=[];this.o=this.l=!1;this.j=void 0;this.D=this.K=this.J=!1;this.G=0;this.g=null;this.A=0}sg.prototype.cancel=function(a){if(this.l)this.j instanceof sg&&this.j.cancel();else{if(this.g){var b=this.g;delete this.g;a?b.cancel(a):(b.A--,b.A<=0&&b.cancel())}this.D=!0;this.l||(a=new tg(this),ug(this),vg(this,!1,a))}};sg.prototype.H=function(a,b){this.J=!1;vg(this,a,b)};function vg(a,b,c){a.l=!0;a.j=c;a.o=!b;wg(a)}function ug(a){if(a.l){if(!a.D)throw new xg(a);a.D=!1}} +function yg(a){throw a;}function zg(a,b,c){return Ag(a,b,null,c)}function Bg(a,b,c){Ag(a,b,function(d){var e=b.call(this,d);if(e===void 0)throw d;return e},c)}function Ag(a,b,c,d){var e=a.l;e||(b===c?b=c=Ef(b):(b=Ef(b),c=Ef(c)));a.v.push([b,c,d]);e&&wg(a);return a}sg.prototype.then=function(a,b,c){var d,e,f=new X(function(g,h){e=g;d=h});Ag(this,e,function(g){g instanceof tg?f.cancel():d(g);return Cg},this);return f.then(a,b,c)};sg.prototype.$goog_Thenable=!0; +function Dg(a){return Ra(a.v,function(b){return typeof b[1]==="function"})}var Cg={}; +function wg(a){if(a.G&&a.l&&Dg(a)){var b=a.G,c=Eg[b];c&&(w.clearTimeout(c.g),delete Eg[b]);a.G=0}a.g&&(a.g.A--,delete a.g);b=a.j;for(var d=c=!1;a.v.length&&!a.J;){var e=a.v.shift(),f=e[0],g=e[1];e=e[2];if(f=a.o?g:f)try{var h=f.call(e||null,b);h===Cg&&(h=void 0);h!==void 0&&(a.o=a.o&&(h==b||h instanceof Error),a.j=b=h);if(Vf(b)||typeof w.Promise==="function"&&b instanceof w.Promise)d=!0,a.J=!0}catch(k){b=k,a.o=!0,Dg(a)||(c=!0)}}a.j=b;d&&(h=x(a.H,a,!0),d=x(a.H,a,!1),b instanceof sg?(Ag(b,h,d),b.K=!0): +b.then(h,d));c&&(b=new Fg(b),Eg[b.g]=b,a.G=b.g)}function Gg(a){var b=new sg;ug(b);vg(b,!0,a);return b}function xg(){A.call(this)}z(xg,A);xg.prototype.message="Deferred has already fired";xg.prototype.name="AlreadyCalledError";function tg(){A.call(this)}z(tg,A);tg.prototype.message="Deferred was canceled";tg.prototype.name="CanceledError";function Fg(a){this.g=w.setTimeout(x(this.l,this),0);this.j=a}Fg.prototype.l=function(){delete Eg[this.g];yg(this.j)};var Eg={};function Hg(){}function Ig(a){return a!=null&&!!a.wa}Hg.prototype.wa=!0;Hg.prototype.B=["javax.inject.Provider",1];function Jg(){}function Kg(a){return a!=null&&!!a.va}Jg.prototype.va=!0;Jg.prototype.B=["com.google.apps.docs.xplat.flag.FlagService",1];var Lg;function Mg(){if(Lg==null){var a=new Ng(null);Lg=function(){return a}}var b;return R((b=Lg,b()),Kg,Jg)};function Og(){}u(Og,L);Og.prototype.get=function(){if(this.j==null){var a=R(w._docs_flag_initialData,Oe,Ne);this.j=a!=null?a:R({},Oe,Ne)}return this.j};Og.prototype.g=function(){return this.get()};Og.prototype.wa=!0;Og.prototype.B=["com.google.apps.docs.xplat.flag.FlagServiceHelper",0];function Pg(a){return typeof a=="string"?a=="true"||a=="1":!!a};function Ng(a){this.g=new Og;this.j=null;if(a!=null)for(var b in a){var c=b,d=a[b];if(this.j!=null)throw ke("Cannot use setClientFlag when comparison is enabled.").g;var e=R(this.g.g(),Oe,Ne);Ae(d)?(d=R(d,Ae,U).V,e[c]=d):e[c]=d!=null?d:null}}u(Ng,L);Ng.prototype.clear=function(){this.g=new Og;this.j=null};Ng.prototype.get=function(a){Qg(this,a);return R(this.g.g(),Oe,Ne)[a]};function Rg(a,b){a=R(a.g.g(),Oe,Ne);return b in a} +function Sg(a,b){Qg(a,b);if(!Rg(a,b)||a.get(b)==null)return NaN;try{var c=M(a.get(b));oe==null&&(oe=RegExp("^\\s*[+-]?(NaN|Infinity|((\\d+\\.?\\d*)|(\\.\\d+))([eE][+-]?\\d+)?[dDfF]?)\\s*$"));if(!oe.test(c)){var d=new Be;d.j='For input string: "'+M(c)+'"';Q(d);P(d,Error(d));throw d.g;}return parseFloat(c)}catch(f){var e=Vd(f);if(e instanceof Be)return NaN;throw e.g;}} +function Tg(a,b){Qg(a,b);if(!Rg(a,b))return"";a=a.get(b);if(a==null)a="";else{if(b="number"===typeof a){b=qe(T(a));var c=qe(T(a));b=b.equals(c)}a=b?""+qe(T(a)):M(a)}return a} +function Qg(a,b){if(a.j!=null){try{var c=R(a.g.g(),Oe,Ne)[b]}catch(h){var d=Vd(h);if(d instanceof S)c="injection-failed";else throw d.g;}try{var e=a.j;if(e==null)throw Wd().g;var f=R(R(e,Ig,Hg).g(),Oe,Ne)[b]}catch(h){var g=Vd(h);if(g instanceof S)f="injection-failed";else throw g.g;}a=c;!(b=Nd(a,f))&&(b=a!=null)&&(b=a.equals?a.equals(f):Object.is(a,f));if(!b)throw ke("Logging is not supported.").g;}}Ng.prototype.va=!0;Ng.prototype.B=["com.google.apps.docs.xplat.flag.FlagServiceImpl",0];function Ug(a){He.call(this,a,null);P(this,Error(this))}u(Ug,He);Ug.prototype.B=["com.google.apps.docs.xplat.net.LimitException",0];function Vg(a,b,c,d){Ue();this.g=!1;this.G=a;this.l=b;this.j=new Wg(Math.imul(c,1E3),d)}u(Vg,Se);function Xg(a){if(!((a.j.get(null)+1|0)/T(a.j.l/1E3)<=a.l))throw(new Ug("Query would cause "+M(a.G)+" to exceed "+a.l+" qps.")).g;a=a.j;var b=vd(Cd(Date.now()));Yg(a,b);var c=R(Zg(a.g),$g,ah);if(c==null||T(b)>=T(c.j))b=bh(a,T(b)),c=new ah,c.j=b,c.g=0,c.o=2147483647,c.l=-2147483648,a.g.add(c);c.g=c.g+1|0;c.o=Math.min(1,c.o);c.l=Math.max(1,c.l)} +Vg.prototype.B=["com.google.apps.docs.xplat.net.QpsLimiter",0];function ah(){this.l=this.o=this.g=0}u(ah,L);function $g(a){return a instanceof ah}ah.prototype.B=["com.google.apps.docs.xplat.util.BasicStat$Slot",0];function Wg(a){this.j=0;this.l=a;this.j=re(a/50);this.g=new ch(ze(50))}u(Wg,L);Wg.prototype.get=function(a){return dh(this,a,function(b,c){b=R(b,Ae,U);c=R(c,$g,ah);return ze(b.V+c.g|0)})};function dh(a,b,c){b=b!=null?T(b):vd(Cd(Date.now()));Yg(a,b);var d=0;b=bh(a,T(b));b=T(b)-a.l;for(var e=a.g.g.length-1|0;e>=0;e=e-1|0){var f=R(a.g.get(e),$g,ah);if(T(f.j)<=b)break;d=R(c(ze(d),f),Ae,U).V}return d}function bh(a,b){return a.j*Math.floor(b/a.j+1)} +function Yg(a,b){var c=R(Zg(a.g),$g,ah);c!=null&&(c=T(c.j)-a.j,T(b)=a.g.length)throw a=new $d,Q(a),P(a,Error(a)),a.g;return a.g.length1||f.length==1&& +f[0]!="")&&f.pop(),d&&g==e.length&&f.push("")):(f.push(h),d=!0)}d=f.join("/")}else d=e}c?uh(b,d):c=a.l.toString()!=="";c?vh(b,a.l.clone()):c=!!a.G;c&&(b.G=a.G);return b};rh.prototype.clone=function(){return new rh(this)};function sh(a,b,c){a.o=c?wh(b,!0):b;a.o&&(a.o=a.o.replace(/:$/,""))}function th(a,b){if(b){b=Number(b);if(isNaN(b)||b<0)throw Error("Bad port number "+b);a.A=b}else a.A=null}function uh(a,b,c){a.j=c?wh(b,!0):b;return a} +function vh(a,b,c){b instanceof xh?(a.l=b,Dh(a.l,a.v)):(c||(b=yh(b,Eh)),a.l=new xh(b,a.v))}function wh(a,b){return a?b?decodeURI(a.replace(/%25/g,"%2525")):decodeURIComponent(a):""}function yh(a,b,c){return typeof a==="string"?(a=encodeURI(a).replace(b,Fh),c&&(a=a.replace(/%25([0-9a-fA-F]{2})/g,"%$1")),a):null}function Fh(a){a=a.charCodeAt(0);return"%"+(a>>4&15).toString(16)+(a&15).toString(16)}var zh=/[#\/\?@]/g,Bh=/[#\?:]/g,Ah=/[#\?]/g,Eh=/[#\?@]/g,Ch=/#/g; +function xh(a,b){this.j=this.g=null;this.l=a||null;this.o=!!b}function Gh(a){a.g||(a.g=new Map,a.j=0,a.l&&vf(a.l,function(b,c){a.add(decodeURIComponent(b.replace(/\+/g," ")),c)}))}p=xh.prototype;p.add=function(a,b){Gh(this);this.l=null;a=Hh(this,a);var c=this.g.get(a);c||this.g.set(a,c=[]);c.push(b);this.j=this.j+1;return this};p.remove=function(a){Gh(this);a=Hh(this,a);return this.g.has(a)?(this.l=null,this.j=this.j-this.g.get(a).length,this.g.delete(a)):!1}; +p.clear=function(){this.g=this.l=null;this.j=0};function Ih(a,b){Gh(a);b=Hh(a,b);return a.g.has(b)}p.forEach=function(a,b){Gh(this);this.g.forEach(function(c,d){c.forEach(function(e){a.call(b,e,d,this)},this)},this)};p.ha=function(a){Gh(this);var b=[];if(typeof a==="string")Ih(this,a)&&(b=b.concat(this.g.get(Hh(this,a))));else{a=Array.from(this.g.values());for(var c=0;c0?String(a[0]):b}; +p.toString=function(){if(this.l)return this.l;if(!this.g)return"";for(var a=[],b=Array.from(this.g.keys()),c=0;c0)){this.l=null;d=this.g;var f=d.set;e=Hh(this,e);var g=c.length;if(g>0){for(var h=Array(g),k=0;k-1?(b=a[g],c||(b.ea=!1)):(b=new Qh(b,this.src,f,!!d,e),b.ea=c,a.push(b));return b};Sh.prototype.remove=function(a,b,c,d){a=a.toString();if(!(a in this.g))return!1;var e=this.g[a];b=Th(e,b,c,d);return b>-1?(Rh(e[b]),Array.prototype.splice.call(e,b,1),e.length==0&&(delete this.g[a],this.j--),!0):!1}; +function Uh(a,b){var c=b.type;c in a.g&&Sa(a.g[c],b)&&(Rh(b),a.g[c].length==0&&(delete a.g[c],a.j--))}Sh.prototype.removeAll=function(a){a=a&&a.toString();var b=0,c;for(c in this.g)if(!a||c==a){for(var d=this.g[c],e=0;e-1?b[a]:null)&&gi(c))} +function gi(a){if(typeof a!=="number"&&a&&!a.removed){var b=a.src;if(b&&b[Oh])Uh(b.j,a);else{var c=a.type,d=a.proxy;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(di(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Xh--;(c=bi(b))?(Uh(c,a),c.j==0&&(c.src=null,b[Vh]=null)):Rh(a)}}}function di(a){return a in Wh?Wh[a]:Wh[a]="on"+a} +function ei(a,b){if(a.removed)a=!0;else{b=new Nh(b,this);var c=a.listener,d=a.ja||a.src;a.ea&&gi(a);a=c.call(d,b)}return a}function bi(a){a=a[Vh];return a instanceof Sh?a:null}var hi="__closure_events_fn_"+(Math.random()*1E9>>>0);function $h(a){if(typeof a==="function")return a;a[hi]||(a[hi]=function(b){return a.handleEvent(b)});return a[hi]}Kf(function(a){ei=a(ei)});function ii(a,b){Lh.call(this,a);this.error=b}u(ii,Lh);var ji=/\/d\/([^\/]+)/,ki=/\/r\/([^\/]+)/;function li(a){a=a.match(uf)[5]||null;return ji.test(a)}function mi(a,b){if(li(a)){li(a);a=a.match(uf);var c=a[5];c=c.replace(b,"");b=tf(a[1],a[2],a[3],a[4],c,a[6],a[7])}else b=a;return b};function Z(){W.call(this);this.j=new Sh(this);this.Da=this;this.P=null}z(Z,W);Z.prototype[Oh]=!0;p=Z.prototype;p.addEventListener=function(a,b,c,d){Yh(this,a,b,c,d)};p.removeEventListener=function(a,b,c,d){fi(this,a,b,c,d)}; +p.dispatchEvent=function(a){var b=this.P;if(b){var c=[];for(var d=1;b;b=b.P)c.push(b),++d}b=this.Da;d=a.type||a;if(typeof a==="string")a=new Lh(a,b);else if(a instanceof Lh)a.target=a.target||b;else{var e=a;a=new Lh(d,b);qh(a,e)}e=!0;var f;if(c)for(f=c.length-1;!a.j&&f>=0;f--){var g=a.currentTarget=c[f];e=ni(g,d,!0,a)&&e}a.j||(g=a.currentTarget=b,e=ni(g,d,!0,a)&&e,a.j||(e=ni(g,d,!1,a)&&e));if(c)for(f=0;!a.j&&f2147483647?-1:w.setTimeout(a,b||0)}function pi(){var a=null;return(new X(function(b,c){a=oi(function(){b(void 0)},14E3);a==-1&&c(Error("Failed to schedule timer."))})).oa(function(b){w.clearTimeout(a);throw b;})};function qi(a,b,c){W.call(this);this.g=a;this.l=b||0;this.j=c;this.o=x(this.Sa,this)}z(qi,W);p=qi.prototype;p.aa=0;p.L=function(){qi.T.L.call(this);this.stop();delete this.g;delete this.j};p.start=function(a){this.stop();this.aa=oi(this.o,a!==void 0?a:this.l)};p.stop=function(){this.isActive()&&w.clearTimeout(this.aa);this.aa=0};p.isActive=function(){return this.aa!=0};p.Sa=function(){this.aa=0;this.g&&this.g.call(this.j)};function ri(a,b,c,d){W.call(this);this.l=d!=null?d:.15;this.v=a;this.o=b;this.D=c;this.g=new qi(this.fb,void 0,this);this.A=Number.NEGATIVE_INFINITY;this.j=0}u(ri,W);p=ri.prototype;p.isActive=function(){return this.g.isActive()};p.start=function(){si(this,!1,!1)};function si(a,b,c){b&&(a.g.stop(),ti(a,a.o));a.isActive()||(b=Math.max(0,a.A+a.j-Date.now()),b==0&&(c?b=ti(a,a.o):a.j=0),a.g.start(b))}p.stop=function(){this.g.stop()}; +function ti(a,b){b>0&&a.l!=0&&(b=Math.floor(b*(1-a.l+Math.random()*a.l*2)));return a.j=b}p.fb=function(){this.A=Date.now();ti(this,Math.min(Math.max(this.j*2,this.o),this.D));this.v()};p.L=function(){this.g.dispose();delete this.g;delete this.v;W.prototype.L.call(this)};function ui(a){W.call(this);this.j=a;this.g={}}z(ui,W);var vi=[];ui.prototype.listen=function(a,b,c,d){Array.isArray(b)||(b&&(vi[0]=b.toString()),b=vi);for(var e=0;e=3&&(h.S= +(ih(),hh));h.l.getState().g>=3||h.S!==(ih(),hh)||xi(h)});this.R=g;this.M=Pg(this.O.get("docs-epfdfjes"));this.ca={}}u(wi,W);p=wi.prototype;p.send=function(a,b,c,d){Pg(this.O.get("docs-dafjera"))&&(a=mi(mi(a,ki),ji));var e=zg(zg(Gg(this.o.length),function(f){if(!(f>=this.da))return this.R&&(a=V(a,"errorSender_enqueueTimeMs",Date.now().toString())),f={},f.u=a,f.m=b,f.c=c,f.h=d,this.enqueue(f)},this),this.sa,this);Bg(e,function(){this.A.delete(e)},this);this.A.add(e)}; +function yi(a){return dg(Array.from(a.A.values())).then(n())}p.sa=function(){var a=this.l&&this.l.getState().g>=3,b=this.ka()||this.g.isActive()||this.j.isActive()||this.N;return a||b?Gg():zi(this)};function zi(a){return function(){return zg(Gg(a.o[0]!==void 0?a.o[0]:null),function(b){return Ai(a,b)})}()} +function Ai(a,b){if(a.j.isActive()||a.g.isActive()||a.N)return Gg();if(!b)return a.j.stop(),Gg();if(b.u.length>4E3)return Bi(a);try{Xg(a.U);a.K=new sg;var c=b.u;a.ba!=null&&(c=V(c,"reportingSessionId",a.ba));a.v>0&&(c=V(c,"retryCount",a.v));a.D!=null&&(c=V(c,"previousErrorSendStatus",a.D));a.R&&(c=V(c,"errorSenderType",a.ya()),b.errorSender_frontIndex&&(c=V(c,"errorSender_frontIndex",b.errorSender_frontIndex)),b.errorSender_nextIndex&&(c=V(c,"errorSender_nextIndex",b.errorSender_nextIndex)),b.errorSender_queueSize&& +(c=V(c,"errorSender_queueSize",b.errorSender_queueSize)));var d=Gg();a.M&&(a.ca=b,d=Bi(a));var e=b.m,f=b.c,g=b.h;return zg(zg(d,function(){a.g.send(c,e,f,g)}),function(){return a.K})}catch(h){if(Ve(h)instanceof Ug)a.N=!0;else throw hf(h,{"docs-origin-class":"docs.debug.ErrorSender"});}return Gg()} +p.ab=function(){var a=Ci(this.g),b=this.K,c=Di(this.g)||a>=400&&a<=500,d=this.v>3;c||d?(this.v=0,this.D=null,this.j.stop(),zg(this.M?Gg():Bi(this),function(){ug(b);vg(b,!0)})):(this.v++,this.D=a===-1?this.g.A:a,xi(this),this.M&&this.enqueue(this.ca),ug(b),vg(b,!0))};function xi(a){a.v!=1||a.j.isActive()?a.j.start():si(a.j,!0,!0)}p.L=function(){Cf(this.H,this.j,this.g,this.P);this.A.clear();W.prototype.L.call(this)};p.ya=ca("BaseErrorSender");function Ei(a,b,c,d,e){wi.call(this,a,b,c,void 0,d,e,void 0);this.o=[]}u(Ei,wi);Ei.prototype.enqueue=function(a){this.o.push(a);return Gg()};function Bi(a){a.o.shift();return Gg()}Ei.prototype.ya=ca("MemoryErrorSender");Ei.prototype.L=function(){delete this.o;wi.prototype.L.call(this)};function Fi(a){this.g=gd(Md(),yc(a));a=$c(this.g,1);this.j=Math.floor(Math.random()*100) \\d+"),RegExp("getReadMode(Config|Render|Extract)")],aj=[RegExp("@file:///|phantomjs|node:electron|py-scrap|eval code|Program Files")],bj=[RegExp("Script https://meet\\.google\\.com/.*meetsw.*load failed"),RegExp("A bad HTTP response code \\(\\d+\\) was received when fetching the script")], +cj=[RegExp("Error loading.*Consecutive load failures"),RegExp("Failed to load module.*Consecutive load failures")];function dj(a,b){this.pa=a;this.ga=b}function ej(a,b){return(b=a.g(b))?{pa:a.pa,ga:a.ga,ua:b.toUpperCase()}:null};function fj(){dj.call(this,1,1)}u(fj,dj);fj.prototype.g=function(a){a:{a=gj(a);for(var b=!1,c=v(Zi),d=c.next();!d.done;d=c.next()){d=a.matchAll(d.value);d=v(d);for(var e=d.next();!e.done;e=d.next())if(e=e.value[1]){if(Yi.includes(e)){a=!1;break a}b=!0}}a=b}return a?"warning":null};function hj(a,b,c,d){this.message=a;this.g=b;this.cause=c;this.j=d}function ij(a){return(a=a.cause)?a.message+"\n"+a.g+"\n"+ij(a):""}function gj(a){return a.message+"\n"+a.g+"\n"+ij(a)}function jj(){this.j=this.g=this.message=""}function kj(a,b){a.message=b;return a};function lj(a){return a instanceof Error||a&&a.message!==void 0?a.message:mj(a)}function nj(a){return a instanceof Error||a&&a.stack!==void 0?a.stack||"":""}function oj(a,b){var c=a&&a.cause!==void 0;if(b>=3||!c)return null;c=new jj;a=a.cause;if(a instanceof Error||a.message!==void 0&&a.stack!==void 0){if(kj(c,lj(a)),c.g=nj(a),b=oj(a,b+1))c.cause=b}else kj(c,mj(a));return new hj(c.message,c.g,c.cause,c.j)} +function mj(a){try{return a&&a instanceof Object?JSON.stringify(a):String(a)}catch(b){return String(a)}}function pj(a,b){var c=kj(new jj,lj(a));c.g=nj(a);if(a=oj(a,0))c.cause=a;b&&(c.j=b);return new hj(c.message,c.g,c.cause,c.j)};function qj(a,b,c,d){dj.call(this,c,d);this.j=a;this.l=b}u(qj,dj);qj.prototype.g=function(a){var b=ij(a);return rj(a.message,this.j)||rj(a.g,this.l)||rj(b,this.j)||rj(b,this.l)?"warning":null};function rj(a,b){b=v(b);for(var c=b.next();!c.done;c=b.next())if(c.value.test(a))return!0;return!1};function sj(a,b,c,d,e){dj.call(this,c,d);this.j=a;this.o=b;this.l=e}u(sj,dj);sj.prototype.g=function(a){if(this.l)a:{a=a.message;for(var b=v(this.j),c=b.next();!c.done;c=b.next())if(a===c.value){a=!0;break a}a=!1}else a=gj(a),a=tj(a,this.j)||tj(a,this.o);return a?"warning":null};function tj(a,b){b=v(b);for(var c=b.next();!c.done;c=b.next())if(a.includes(c.value))return!0;return!1}function uj(a,b,c,d){return new sj(a,b,c,d,!1)};var vj=[new fj,uj("Trusted Type;TrustedHTML;TrustedScript;cannot communicate with background;zaloJSV2;kaspersky-labs;@user-script;Object Not Found Matching Id;contextChanged;Not implemented on this platform;Extension context invalidated;neurosurgeonundergo;realTimeClData;Failed to execute 'querySelectorAll' on 'Document';Promise.all(...).then(...).catch(...).finally is not a function;Error executing Chrome API, chrome.tabs;Identifier 'originalPrompt' has already been declared;User rejected the request;Could not inject ethereum provider because it's not your default extension;Cannot redefine property: googletag;Can't find variable: HTMLDialogElement;Identifier 'listenerName' has already been declared;Cannot read properties of undefined (reading 'info');Permission denied to access property \"type\";Error: Promise timed out;Request timeout ToolbarStatus;Can't find variable: nc;imtgo;ton is not a function;__renderMessageNode is not defined;Cannot redefine property: ethereum;unknown action:;Receiving end does not exist;get-frame-manager-configuration;Key not found;'isAWS'".split(";"), +"puppeteer-core;kaspersky-labs;@user-script;jsQuilting;linkbolic;neurosurgeonundergo;tlscdn;https://cdnjs.cloudflare.com/ajax/libs/mathjax/;secured-pixel.com;Can't find variable: nc;imtgo;_simulateEvent;goguardian".split(";"),1,0),new qj(Xi,Wi,1,0),uj('status is 0, navigator.onLine =;Network sync is disabled. Aborting a network request of int type;The service is currently unavailable.;Internal error encountered.;data does not exist in AF cache;There was an error during the transport or processing of this request;Failed to load gapi;Rpc failed due to xhr error. error code: 6, error: [0];An interceptor has requested that the request be retried;8,"generic";A network error occurred'.split(";"), +Vi,2,0),new qj($i,aj,3,0),uj("Kg is not defined;uncaught error;The play method is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.;Illegal invocation;Script error;zCommon;can't access dead object;Java exception was raised during method invocation;pauseVideo is not a function;ResizeObserver loop;wallet must has at least one account;xbrowser is not defined;jQuery is not defined;Cannot read properties of null (reading 'requestAnimationFrame');Class extends value undefined is not a constructor or null;GM3TooltipService: No tooltip with id;Mole was disposed;getInitialTopicListResponse is missing for stream rendering;getPeopleById call preempted;The operation is insecure;class heritage;The play() request was interrupted;args.site.enabledFeatures is undefined;frappe is not defined;Cannot set properties of undefined (setting 'hidden');Identifier 'checkOngoingMeeting' has already been declared;AutofillCallbackHandler;invalid wire type;zp_token;isReCreate;HTMLOUT is not defined;Shopify root is null;CanvasMaskingStrategy_Redact;_chromeNamespace;feature named `performanceMetrics`;feature named `webCompat`;enableDidUserTypeOnKeyboardLogging;Cannot redefine property: webdriver".split(";"), +["postUserData"],3,0),new qj(bj,Wi,5,0),uj("Service worker registration is disabled by MDA;An unknown error occurred when fetching the script;Operation has been aborted;Timed out while trying to start the Service Worker;The Service Worker system has shutdown;The user denied permission to use Service Worker;The script resource is behind a redirect, which is disallowed;The document is in an invalid state;ServiceWorker script evaluation failed;ServiceWorker cannot be started;Failed to access storage;Worker disallowed;encountered an error during installation".split(";"), +Vi,5,0),new qj(cj,cj,4,0),uj(["Timeout reached for loading script https://www.gstatic.com/_/apps-fileview/_/js/","Error while loading script https://www.gstatic.com/_/apps-fileview/_/js/"],Vi,4,0)],wj=new Set(["SEVERE","SEVERE_AFTER_INITIAL","UNKNOWN","FATAL",""]);function xj(a){this.j=a;this.g=!1} +function yj(a,b){var c="missing",d=new Map,e=!0;try{c=b.j;a.g&&d.set("apps_telemetry.after_downgraded_severe","true");for(var f=v(a.j),g=f.next();!g.done;g=f.next()){var h=g.value;try{var k=ej(h,b);if(k){var l=c,m=zj(a,c)?k.ua:c;Aj(k,l,m).forEach(function(r,y){d.set(y,r)});c=m;break}}catch(r){e=!1;var t=pj(r,c);d.set("apps_telemetry.handling_error",gj(t)+"\n\nclassifier: "+h.constructor.name)}}}catch(r){e=!1,a=pj(r,c),d.set("apps_telemetry.handling_error",gj(a))}d.set("apps_telemetry.processed",String(e)); +return{ua:c,Ta:d}}function Aj(a,b,c){var d=new Map;d.set("apps_telemetry.classification",a.pa.toString());d.set("apps_telemetry.classification_code",a.ga?a.ga.toString():"");d.set("apps_telemetry.incoming_severity",b);d.set("apps_telemetry.outgoing_severity",c);return d}function zj(a,b){return wj.has(b.toUpperCase())?a.g=!0:!1};function Bj(){}Bj.prototype.Z=function(){if("WorkerGlobalScope"in w&&self instanceof w.WorkerGlobalScope)return new Map;try{var a=Array.from(document.querySelectorAll("script")).filter(this.j).slice(0,30).map(this.g).join("\n")}catch(b){a="Error getting cross-origin scripts"}return(new Map).set("apps_telemetry.cross_origin_scripts",a)}; +Bj.prototype.j=function(a){var b=new RegExp(/^(?:https?:\/\/)?(?:[a-zA-Z0-9-]+\.)*google\.com(?:$|[\/#?])/);return(a=a.getAttribute("src"))?!(a.startsWith("/")||b.test(a)):!1};Bj.prototype.g=function(a){return a.innerHTML?a.outerHTML.slice(0,a.outerHTML.indexOf(a.innerHTML)):a.outerHTML};function Cj(){}Cj.prototype.Z=function(){try{var a=performance.getEntriesByType("resource").slice(-5).map(function(b){return Af(b.name)}).join("\n")}catch(b){a="Error getting last 5 resources"}return(new Map).set("apps_telemetry.resources",a)};/* + +Math.uuid.js (v1.4) +http://www.broofa.com +mailto:robert@broofa.com +Copyright (c) 2010 Robert Kieffer +Dual licensed under the MIT and GPL licenses. +*/ +var Dj="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");function Ej(a,b,c){a=a===void 0?[]:a;b=b===void 0?[]:b;c=c===void 0?[]:c;var d=a;a=[Error("uncaught error").message];var e=[];if(b.length>0){var f=e.push,g=[];b=v(b);for(var h=b.next();!h.done;h=b.next())g.push(new RegExp(h.value));f.call(e,new qj(g,g,7,0))}e.push.apply(e,pa(vj));d=v(d);for(f=d.next();!f.done;f=d.next())e.push(f.value);a.length>0&&e.push(new sj(a,[],3,5,!0));this.l=new xj(e);this.g=[new Ri,new Bj,new Cj];this.g.push.apply(this.g,pa(c));c=[];c[8]=c[13]=c[18]=c[23]="-";c[14]="4";for(a= +0;a<36;a++)c[a]||(e=0|Math.random()*16,c[a]=Dj[a==19?e&3|8:e]);this.j=c.join("")}function Fj(a,b,c,d){d["apps_telemetry.session_id"]=a.j;"apps_telemetry.processed"in d&&(d["apps_telemetry.multi_processed"]="true");var e=a.Z();(a=Gj(a,b,c,e))&&Hj(e,a.Ta);e.forEach(function(g,h){d[h]=g});var f;return(f=a==null?void 0:a.ua)!=null?f:c}function Gj(a,b,c,d){try{var e=pj(b,c);return yj(a.l,e)}catch(f){Ij(d,f,"apps_telemetry.processed")}return null} +Ej.prototype.Z=function(){var a=new Map;try{for(var b=v(this.g),c=b.next();!c.done;c=b.next())c.value.Z().forEach(function(d,e){a.set(e,d)})}catch(d){Ij(a,d,"apps_telemetry.annotated")}return a};function Hj(a,b){b.forEach(function(c,d){a.set(d,c)})}function Ij(a,b,c){a.set(c,"false");a.set("apps_telemetry.handling_error",mj(b))};function Jj(a){var b=a=a===void 0?{}:a;a=b.xa===void 0?[]:b.xa;var c=b.gb===void 0?[]:b.gb,d=b.eb===void 0?[]:b.eb;b=b.cb===void 0?[]:b.cb;try{var e=Fd=Fd||new Gd;var f=Kd.key in e.g?Kd.ctor(e.g[Kd.key]):Kd.defaultValue,g=void 0===Bb?2:4;e=void 0;var h=f.C,k=h[C]|0,l=zb(f,k)?1:g;e=!!e||l===3;l===2&&Fc(f)&&(h=f.C,k=h[C]|0);var m=Pc(h,1),t=m===ub?7:m[C]|0,r=Qc(t,k);if(f=4&r?!1:!0){4&r&&(m=Array.prototype.slice.call(m),t=0,r=Oc(r,k),k=Lc(h,k,1,m));for(var y=g=0;g0&&h.push(uj(c,[],6,0));d.length>0&&h.push(new qj(d,[],6,0));b.length>0&&h.push(uj(b,[],6,5));return new Ej(h,N,[new Oi].concat(pa(a)))};try{var Kj,Lj,Mj=(Lj=(Kj=window)==null?void 0:Kj.top)!=null?Lj:w;Mj.U3bHHf!=null||(Mj.U3bHHf=0);Mj.U3bHHf++}catch(a){w.U3bHHf!=null||(w.U3bHHf=0),w.U3bHHf++};"#".replace(/([-()\[\]{}+?*.$\^|,:#2){var h=Array.prototype.slice.call(arguments,2);g=function(){e.apply(this,h)}}return d(g,f)};c[b][Uj(a,!1)]=d} +Sj.prototype.L=function(){var a=w.window||w.globalThis;var b=a.setTimeout;b=b[Uj(this,!1)]||b;a.setTimeout=b;b=a.setInterval;b=b[Uj(this,!1)]||b;a.setInterval=b;Sj.T.L.call(this)};function Xj(a){A.call(this,"Error in protected function: "+(a&&a.message?String(a.message):String(a)),a);(a=a&&a.stack)&&typeof a==="string"&&(this.stack=a)}z(Xj,A);function ak(){Z.call(this);this.headers=new Map;this.l=!1;this.g=null;this.M="";this.A=0;this.v=this.K=this.D=this.H=!1;this.N=0;this.o=null;this.O="";this.R=!1}z(ak,Z);var bk=/^https?$/i,ck=["POST","PUT"],dk=[];p=ak.prototype;p.Qa=function(){this.dispose();Sa(dk,this)}; +p.send=function(a,b,c,d){if(this.g)throw Error("[goog.net.XhrIo] Object is active with another request="+this.M+"; newUri="+a);b=b?b.toUpperCase():"GET";this.M=a;this.A=0;this.H=!1;this.l=!0;this.g=new XMLHttpRequest;this.g.onreadystatechange=Ef(x(this.Aa,this));try{this.K=!0,this.g.open(b,String(a),!0),this.K=!1}catch(g){ek(this);return}a=c||"";c=new Map(this.headers);if(d)if(Object.getPrototypeOf(d)===Object.prototype)for(var e in d)c.set(e,d[e]);else if(typeof d.keys==="function"&&typeof d.get=== +"function"){e=v(d.keys());for(var f=e.next();!f.done;f=e.next())f=f.value,c.set(f,d.get(f))}else throw Error("Unknown input type for opt_headers: "+String(d));d=Array.from(c.keys()).find(function(g){return"content-type"==g.toLowerCase()});e=w.FormData&&a instanceof w.FormData;!(Array.prototype.indexOf.call(ck,b,void 0)>=0)||d||e||c.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8");b=v(c);for(d=b.next();!d.done;d=b.next())c=v(d.value),d=c.next().value,c=c.next().value,this.g.setRequestHeader(d, +c);this.O&&(this.g.responseType=this.O);"withCredentials"in this.g&&this.g.withCredentials!==this.R&&(this.g.withCredentials=this.R);try{this.o&&(clearTimeout(this.o),this.o=null),this.N>0&&(this.o=setTimeout(this.hb.bind(this),this.N)),this.D=!0,this.g.send(a),this.D=!1}catch(g){ek(this)}};p.hb=function(){typeof va!="undefined"&&this.g&&(this.A=8,this.dispatchEvent("timeout"),this.abort(8))};function ek(a){a.l=!1;a.g&&(a.v=!0,a.g.abort(),a.v=!1);a.A=5;fk(a);gk(a)} +function fk(a){a.H||(a.H=!0,a.dispatchEvent("complete"),a.dispatchEvent("error"))}p.abort=function(a){this.g&&this.l&&(this.l=!1,this.v=!0,this.g.abort(),this.v=!1,this.A=a||7,this.dispatchEvent("complete"),this.dispatchEvent("abort"),gk(this))};p.L=function(){this.g&&(this.l&&(this.l=!1,this.v=!0,this.g.abort(),this.v=!1),gk(this,!0));ak.T.L.call(this)};p.Aa=function(){this.ka()||(this.K||this.D||this.v?hk(this):this.ta())};p.ta=function(){hk(this)}; +function hk(a){if(a.l&&typeof va!="undefined")if(a.D&&(a.g?a.g.readyState:0)==4)setTimeout(a.Aa.bind(a),0);else if(a.dispatchEvent("readystatechange"),(a.g?a.g.readyState:0)==4){a.l=!1;try{Di(a)?(a.dispatchEvent("complete"),a.dispatchEvent("success")):(a.A=6,fk(a))}finally{gk(a)}}}function gk(a,b){if(a.g){a.o&&(clearTimeout(a.o),a.o=null);var c=a.g;a.g=null;b||a.dispatchEvent("ready");try{c.onreadystatechange=null}catch(d){}}}p.isActive=function(){return!!this.g}; +function Di(a){var b=Ci(a);a:switch(b){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var c=!0;break a;default:c=!1}if(!c){if(b=b===0)a=String(a.M).match(uf)[1]||null,!a&&w.self&&w.self.location&&(a=w.self.location.protocol.slice(0,-1)),b=!bk.test(a?a.toLowerCase():"");c=b}return c}function Ci(a){try{return(a.g?a.g.readyState:0)>2?a.g.status:-1}catch(b){return-1}}Kf(function(a){ak.prototype.ta=a(ak.prototype.ta)});function ik(a,b,c){Z.call(this);this.v=b||null;this.o={};this.A=jk;this.H=a;if(!c){this.g=null;this.g=new Sj(x(this.l,this));Zj(this.g,"setTimeout");Zj(this.g,"setInterval");a=this.g;b=w.window||w.globalThis;c=["requestAnimationFrame","mozRequestAnimationFrame","webkitAnimationFrame","msRequestAnimationFrame"];for(var d=0;d0;)f=" "+f;d.call(c,"[",f,"s] ");c.push("[",b.j(),"] ");c.push(b.getMessage());a.l&&(b=b.g(),b!==void 0&&c.push("\n",b instanceof +Error?b.message:String(b)));a.g&&c.push("\n");return c.join("")};function tk(a){a=a===void 0?new uk:a;Z.call(this);var b=this;this.O={};this.g=null;this.l={};this.M=new ui(this);this.Ra=a.G;this.R=a.K;this.Ha=a.D;this.Oa=a.v;this.Ia=a.M;var c=a.j;this.Fa=Jj({xa:a.H});this.Na=a.P;this.S=new Kh;var d=new ak;vk(this,c);this.A=new Ei(d,c,void 0,void 0,void 0);Df(this,this.A);this.o=a.g?a.g:Tg(c,"docs-sup")+Tg(c,"docs-jepp")+"/jserror";if(d=Tg(c,"jobset"))this.o=V(this.o,"jobset",d);if(d=Tg(c,"docs-ci"))this.o=V(this.o,"id",d);d=Tg(c,"docs-pid");Pg(c.get("docs-eaotx"))&& +d&&(this.o=V(this.o,"ouid",d));this.ca=Sg(c,"docs-srmoe")||0;this.Ka=Pg(c.get("docs-oesf"));this.da=Sg(c,"docs-srmour")||0;this.Ma=Pg(c.get("docs-oursf"));d=a.o||this.da>0&&Math.random()0&&Math.random()0&&Math.random()0&&Math.random()0){var d=new rk,e="";rf(function(g){e+=sk(d,g)});b.clientLog=e}c=b.severity||"fatal";this.Na||(c=Fj(this.Fa,a,c,b));this.ba&&(b.reportName=this.ba+"_"+c);b.isArrayPrototypeIntact=Hi().toString();if(!("WorkerGlobalScope"in w&&self instanceof w.WorkerGlobalScope)){try{var f=!!document.getElementById("docs-editor")}catch(g){f=!1}b.isEditorElementAttached=f.toString()}b.documentCharacterSet= +document.characterSet;b.origin=String(w.origin);f=a.stack||"";if(f.trim().length==0||f=="Not available")b["stacklessError-reportingStack"]=gf(tk.prototype.U),[a.message].concat(pa(Object.keys(b)),pa(Object.values(b))).some(function(g){return g&&g.includes("");this.D&&!this.N?(this.H=this.v,c=="fatal"?c="postmortem":c=="incident"&&(c="warningafterdeath")):c=="fatal"&&(this.D=!0);this.v=!1;b.severity=c}; +tk.prototype.L=function(){zk=!1;if(this.K)for(var a=this.K,b=v(a.et),c=b.next();!c.done;c=b.next()){c=c.value;var d=Nj(a.el,c);if(d&&(Sa(d,a.Pa),!d.length)){d=a.el;var e=Ja(d.getAttribute("jsaction")||"");c+=":.CLIENT";e=e.replace(c+";","");e=e.replace(c,"");Rj(d,e)}}Cf(this.M,this.g,this.A);Z.prototype.L.call(this)};var zk=!1,Ak=null;function uk(){this.K=this.j=void 0;this.v=this.M=this.G=!1;this.g=void 0;this.D=this.l=!1;this.A=!0;this.J=[];this.P=this.o=!1;this.H=[]} +function Ck(a,b){a instanceof He&&(a=a.g);eb(a,"severity",b)};function Fk(a,b){Z.call(this);this.U=a;this.N=b;this.K=void 0;this.status=this.readyState=0;this.responseType=this.o=this.l=this.statusText="";this.onreadystatechange=null;this.M=new Headers;this.v=null;this.R="GET";this.S="";this.g=!1;this.O=this.A=this.D=null;this.H=new AbortController}z(Fk,Z);p=Fk.prototype;p.open=function(a,b){if(this.readyState!=0)throw this.abort(),Error("Error reopening a connection");this.R=a;this.S=b;this.readyState=1;Gk(this)}; +p.send=function(a){if(this.readyState!=1)throw this.abort(),Error("need to call open() first. ");if(this.H.signal.aborted)throw this.abort(),Error("Request was aborted.");this.g=!0;var b={headers:this.M,method:this.R,credentials:this.K,cache:void 0,signal:this.H.signal};a&&(b.body=a);(this.U||w).fetch(new Request(this.S,b)).then(this.Za.bind(this),this.ia.bind(this))}; +p.abort=function(){this.l=this.o="";this.M=new Headers;this.status=0;this.H.abort("Request was aborted.");this.A&&this.A.cancel("Request was aborted.").catch(n());this.readyState>=1&&this.g&&this.readyState!=4&&(this.g=!1,Hk(this));this.readyState=0}; +p.Za=function(a){if(this.g&&(this.D=a,this.v||(this.status=this.D.status,this.statusText=this.D.statusText,this.v=a.headers,this.readyState=2,Gk(this)),this.g&&(this.readyState=3,Gk(this),this.g)))if(this.responseType==="arraybuffer")a.arrayBuffer().then(this.Xa.bind(this),this.ia.bind(this));else if(typeof w.ReadableStream!=="undefined"&&"body"in a){this.A=a.body.getReader();if(this.N){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.l= +[]}else this.l=this.o="",this.O=new TextDecoder;Ik(this)}else a.text().then(this.Ya.bind(this),this.ia.bind(this))};function Ik(a){a.A.read().then(a.Wa.bind(a)).catch(a.ia.bind(a))}p.Wa=function(a){if(this.g){if(this.N&&a.value)this.l.push(a.value);else if(!this.N){var b=a.value?a.value:new Uint8Array(0);if(b=this.O.decode(b,{stream:!a.done}))this.l=this.o+=b}a.done?Hk(this):Gk(this);this.readyState==3&&Ik(this)}};p.Ya=function(a){this.g&&(this.l=this.o=a,Hk(this))}; +p.Xa=function(a){this.g&&(this.l=a,Hk(this))};p.ia=function(){this.g&&Hk(this)};function Hk(a){a.readyState=4;a.D=null;a.A=null;a.O=null;Gk(a)}p.setRequestHeader=function(a,b){this.M.append(a,b)};p.getResponseHeader=function(a){return this.v?this.v.get(a.toLowerCase())||"":""};p.getAllResponseHeaders=function(){if(!this.v)return"";for(var a=[],b=this.v.entries(),c=b.next();!c.done;)c=c.value,a.push(c[0]+": "+c[1]),c=b.next();return a.join("\r\n")}; +function Gk(a){a.onreadystatechange&&a.onreadystatechange.call(a)}Object.defineProperty(Fk.prototype,"withCredentials",{get:function(){return this.K==="include"},set:function(a){this.K=a?"include":"same-origin"}});function Jk(a){this.g=null;this.j=a<1;this.l=a<.01}function Kk(a,b){var c=c===void 0?{}:c;a.l&&(c.sampling_samplePercentage=(.01).toString(),a.g.info(b,c))}function Lk(a,b,c){c=c===void 0?{}:c;a.j&&(c.sampling_samplePercentage=(1).toString(),Ek(a.g,b,c))};function Mk(a){this.C=G(a,void 0,void 0,2048)}u(Mk,J);Mk.prototype.getMessage=function(){return bd(this,1)};function Nk(a){this.C=G(a,void 0,void 0,2048)}u(Nk,J);function Ok(){var a=new Nk;return ed(a,2,Date.now().toString())};function Pk(a){this.C=G(a,void 0,void 0,2048)}u(Pk,J);function Qk(a){this.C=G(a,void 0,void 0,2048)}u(Qk,J);function Rk(a){this.C=G(a,void 0,void 0,2048)}u(Rk,J);var Sk=hd(Rk);function Tk(a){this.C=G(a,void 0,void 0,2048)}u(Tk,J);function Uk(a){this.C=G(a,void 0,void 0,2048)}u(Uk,J);function Vk(a,b){return Kc(a,1,b==null?b:dc(b))}Uk.prototype.qa=function(){return Wc(this,Mk,5)};function Wk(a,b){this.j=b;this.g=a}function Xk(a,b){var c=b.g;c&&c.data&&c.ports&&c.ports.length?(b=c.data?Sk(JSON.stringify(c.data)):new Rk,Yk(a,b,c.ports.length>1?c.ports[1]:void 0).then(function(d){c.ports[0].postMessage(xc(d))})):Lk(a.g,Error("Dropped invalid event."),{event:String(b)})}function Yk(a,b,c){return $f().then(function(){return a.j(b,c)}).oa(function(d){d=d instanceof Error?d:Error(d);var e=new Uk,f=new Mk;Yc(e,Mk,5,f);ed(f,1,d.message);return e})};function Zk(a){this.C=G(a,void 0,void 0,2048)}u(Zk,J);function $k(a,b){return Kc(a,1,b==null?b:dc(b))}Zk.prototype.qa=function(){return Wc(this,Mk,3)};function al(a){var b=eg();chrome.runtime.sendMessage(xc(a),void 0,function(c){return bl(b,function(d){return new Zk(d)},c)});return b.promise.Ca(function(c){c=ff(c);eb(c,"offscreenDocumentRequestType",cd(a,1).toString());throw c;})} +function bl(a,b,c){var d=chrome.runtime;c!==void 0?(d=b(c),d.qa()?(b=a.reject,c=Error,d=d.qa(),d=dd(d,1),b.call(a,c("Error from Offscreen page:"+d))):a.resolve(d)):a.reject(Error("No response from Offscreen page:"+(d.lastError?d.lastError.message:"without lastError")))};function cl(a){a=a===null?"null":a===void 0?"undefined":a;var b;Xe===void 0&&(Xe=Ye());a=(b=Xe)?b.createScriptURL(a):a;return new Ze(a)};function dl(a){W.call(this);this.g=this.A=null;this.v=eg();this.o=!1;this.l=0;this.D=null;this.j=new Jk(a)}u(dl,W);function el(a){w.clearTimeout(a.l);a.g&&(a.o&&(a.v=eg(),a.o=!1),a.g.parentNode&&a.g.parentNode.removeChild(a.g),a.g=null);return Promise.resolve()}function fl(a,b){return a.g?Promise.resolve():gl(a,b)} +function gl(a,b){b||Kk(a.j,Error("Creating extension frame without an OUID."));var c=hl(a,b);return el(a).then(function(){a.g=Qi("IFRAME");a.g.id="extensionFrame";$e(a.g,cl(c));document.body.appendChild(a.g);a.l=oi(function(){Lk(a.j,Error("Timed out waiting for frame connection."));return cg([pi(),yi(a.A.A)]).then(function(){w.close()})},14E3);return Promise.resolve()})}function hl(a,b){return uh(a.D,"/offline/extension/frame").toString()+"?ouid="+(b?encodeURIComponent(String(b)):"")} +function il(a,b){return Promise.resolve(a.v.promise).then(function(c){var d=new MessageChannel;return(new Promise(function(e){d.port1.onmessage=function(f){e(new Tk(f.data))};c.postMessage(xc(b),[d.port2])})).finally(function(){d.port1.close()})})}dl.prototype.L=function(){el(this);W.prototype.L.call(this)};function jl(a){this.C=G(a,void 0,void 0,2048)}u(jl,J);function kl(a){this.C=G(a,void 0,void 0,2048)}u(kl,J);function ll(a){var b=new kl;return Kc(b,1,a==null?a:dc(a))}function ml(a){var b=ll(3);return Yc(b,Nk,4,a)}function nl(a,b){return Yc(a,Qk,6,b)};function ol(){W.call(this);var a=this;this.l=null;this.j=this.g=0;chrome.runtime.onConnectExternal.addListener(function(b){return pl(a,b)});ql(this)}u(ol,W);function pl(a,b){a.g++;w.clearTimeout(a.j);b.onDisconnect.addListener(function(){a.g--;a.g==0&&rl(a)})}function rl(a){a.g==0&&(w.clearTimeout(a.j),a.j=oi(function(){a.g==0&&w.close()},6E4))}function ql(a){oi(function(){a.l&&Ek(a.l,ff("Force closed the offscreen document after one hour."));w.close()},36E5)};function sl(){x(this.l,this);this.g=new rk;this.g.j=!1;this.g.l=!1;this.j=this.g.g=!1;this.o={}}function tl(a){1!=a.j&&(a.j=!0)}sl.prototype.l=function(a){function b(f){if(f){if(f.value>=mf.value)return"error";if(f.value>=nf.value)return"warn";if(f.value>=of.value)return"log"}return"debug"}if(!this.o[a.j()]){var c=sk(this.g,a),d=ul;if(d){var e=b(a.o());vl(d,e,c,a.g())}}};var ul=w.console;function vl(a,b,c,d){if(a[b])a[b](c,d===void 0?"":d);else a.log(c,d===void 0?"":d)};function wl(){W.call(this);var a=this,b=new rh(self.location);this.U=xl(b,"sessionId",function(c){return String(c)},Ke());this.g=this.j=this.M=null;this.l=new ol;rl(this.l);this.N=new sl;tl(this.N);this.K=new ui(this);Df(this,this.K);this.K.listen(w,"message",this.R);this.H=xl(b,"randomPercentageForSampling",function(c){return Number(c)},Math.random()*100);this.P=this.H<1;this.o=new Jk(this.H);this.A="unknown";this.D=null;this.v="unknown";this.O=new Wk(this.o,function(c,d){return yl(a,c,d)});chrome.runtime.onMessage.addListener(this.S.bind(this))} +u(wl,W);wl.prototype.R=function(a){Xk(this.O,a)};function yl(a,b,c){var d=Vk(new Uk,ec(H(b,1)));switch(ec(H(b,1,void 0,Ic))){case 1:b=(b=Wc(b,Nk,7))?dd(b,1):null;var e=Ok();b?ed(e,1,b):Kk(a.o,Error("Scheduler frame connect request sent without an ouid."));b=ml(e);return al(b).then(function(){var f=a.g;f.v.resolve(c);f.o=!0;w.clearTimeout(f.l)}).then(function(){return d});case 3:return b=nl(ll(7),Wc(b,Qk,3)),al(b).then(function(){return d})}throw Error("Dropped unknown message "+b);} +wl.prototype.S=function(a,b,c){var d=this;w.clearTimeout(this.l.j);var e=new kl(a);zl(this,e).then(function(f){c(xc(f))}).catch(function(f){var g=f instanceof Error?f:Error(f);f=new Mk;ed(f,1,g.message);g=$k(new Zk,ec(H(e,1)));Yc(g,Mk,3,f);c(xc(g))}).finally(function(){rl(d.l)});return!0}; +function zl(a,b){var c=$k(new Zk,ec(H(b,1)));try{switch(ec(H(b,1,void 0,Ic))){case 1:return Al(a,b),gl(a.g,a.D).then(function(){return c});case 4:return il(a.g,Wc(b,Pk,5)).then(function(d){Yc(c,Tk,4,d);return c});case 5:return el(a.g).then(function(){return c});case 6:return Al(a,b),fl(a.g,a.D).then(function(){return c});default:throw Error("Dropped unknown message");}}catch(d){return Promise.reject(d)}} +function Al(a,b){if(!a.g){b=Wc(b,jl,2);a.D=dd(b,1);a.M=dd(b,2);var c;a.A=(c=mc(H(b,4)))!=null?c:a.A;var d;a.v=(d=mc(H(b,3)))!=null?d:a.v;c=new rh(a.M);var e=uh(c,"/offline/jserror").toString();d=a.P;b=a.U;var f=f===void 0?!1:f;var g=g===void 0?Mg():g;var h=new uk;h.G=!1;h.v=!0;h.g=e;h.l=f;h.j=g;h.o=!1;f=new tk(h);f.l.sessionTypeName="offline-off-screen-document";f.l.reportsNonFatalErrors=String(d);f.l.sid=b;f.l.extensionVersion=a.v;f.l.optInStatus=a.A;a.j=f;Df(a,a.j);a.o.g=a.j;a.l.l=a.j;a.g=new dl(a.H, +"OffscreenDocument");f=a.g;g=a.j;f.A=g;f.j.g=g;a.g.D=c;Df(a,a.g)}}function xl(a,b,c,d){a=a.l.ha(b);return a.length!=0?c(a[0]):d};new wl; diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/page_embed_script.js b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/page_embed_script.js index e8f16d6..6726c39 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/page_embed_script.js +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/page_embed_script.js @@ -1 +1 @@ -(function(){window._docs_chrome_extension_exists=!0;window._docs_chrome_extension_features_version=2;window._docs_chrome_extension_permissions="alarms clipboardRead clipboardWrite storage unlimitedStorage offscreen".split(" ");window._docs_chrome_extension_manifest_version=3;window._docs_chrome_extension_version="1.102.1";}).call(this); +(function(){window._docs_chrome_extension_exists=!0;window._docs_chrome_extension_features_version=2;window._docs_chrome_extension_permissions="alarms clipboardRead clipboardWrite storage unlimitedStorage offscreen".split(" ");window._docs_chrome_extension_manifest_version=3;window._docs_chrome_extension_version="1.102.1";}).call(this); diff --git a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/service_worker_bin_prod.js b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/service_worker_bin_prod.js index ab156da..11967a7 100644 --- a/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/service_worker_bin_prod.js +++ b/.edge-profile-render-1774484525680/Default/Extensions/ghbmnnjooekpmoecnnnilnnbdlolhkhi/1.102.1_0/service_worker_bin_prod.js @@ -1,232 +1,232 @@ -'use strict';function aa(){return function(a){return a}}function n(){return function(){}}function ba(a){return function(){return this[a]}}function ca(a){return function(){return a}}var p,da=typeof Object.create=="function"?Object.create:function(a){function b(){}b.prototype=a;return new b},ea=typeof Object.defineProperties=="function"?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a}; -function fa(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b>>0)+"_",e=0;return b}); -q("Symbol.iterator",function(a){if(a)return a;a=Symbol("Symbol.iterator");ea(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return ra(oa(this))}});return a});function ra(a){a={next:a};a[Symbol.iterator]=function(){return this};return a} -q("Promise",function(a){function b(g){this.g=0;this.l=void 0;this.j=[];this.J=!1;var h=this.o();try{g(h.resolve,h.reject)}catch(k){h.reject(k)}}function c(){this.g=null}function d(g){return g instanceof b?g:new b(function(h){h(g)})}if(a)return a;c.prototype.j=function(g){if(this.g==null){this.g=[];var h=this;this.l(function(){h.D()})}this.g.push(g)};var e=ha.setTimeout;c.prototype.l=function(g){e(g,0)};c.prototype.D=function(){for(;this.g&&this.g.length;){var g=this.g;this.g=[];for(var h=0;h=f}}); -function va(a,b){a instanceof String&&(a+="");var c=0,d=!1,e={next:function(){if(!d&&c>>16&65535)*e+d*(c>>>16&65535)<<16>>>0)|0}}); -q("String.prototype.repeat",function(a){return a?a:function(b){var c=ua(this,null,"repeat");if(b<0||b>1342177279)throw new RangeError("Invalid count value");b|=0;for(var d="";b;)if(b&1&&(d+=c),b>>>=1)c+=c;return d}}); -q("String.prototype.matchAll",function(a){return a?a:function(b){if(b instanceof RegExp&&!b.global)throw new TypeError("RegExp passed into String.prototype.matchAll() must have global tag.");var c=new RegExp(b,b instanceof RegExp?void 0:"g"),d=this,e=!1,f={next:function(){if(e)return{value:void 0,done:!0};var g=c.exec(d);if(!g)return e=!0,{value:void 0,done:!0};g[0]===""&&(c.lastIndex+=1);return{value:g,done:!1}}};f[Symbol.iterator]=function(){return f};return f}});/* - - Copyright The Closure Library Authors. - SPDX-License-Identifier: Apache-2.0 -*/ -var wa=wa||{},w=this||self;function xa(a,b){var c=ya("CLOSURE_FLAGS");a=c&&c[a];return a!=null?a:b}function ya(a){a=a.split(".");for(var b=w,c=0;c>>0),Da=0; -function Ea(a,b,c){return a.call.apply(a.bind,arguments)}function Fa(a,b,c){if(!a)throw Error();if(arguments.length>2){var d=Array.prototype.slice.call(arguments,2);return function(){var e=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(e,d);return a.apply(b,e)}}return function(){return a.apply(b,arguments)}}function x(a,b,c){x=Function.prototype.bind&&Function.prototype.bind.toString().indexOf("native code")!=-1?Ea:Fa;return x.apply(null,arguments)} -function Ga(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function Ha(a){(0,eval)(a)}function Ia(a){return a}function y(a,b){function c(){}c.prototype=b.prototype;a.T=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.kc=function(d,e,f){for(var g=Array(arguments.length-2),h=2;h0:!1};function Sa(a,b){return Array.prototype.indexOf.call(a,b,void 0)}function Ta(a,b){return Array.prototype.some.call(a,b,void 0)}function Ua(a,b){b=Sa(a,b);var c;(c=b>=0)&&Array.prototype.splice.call(a,b,1);return c}function Va(a,b){for(var c=1;c=b||(d[a]=c+1,a=Error(),gb(a,"severity","incident"),Ja(a))}};function kb(){return typeof BigInt==="function"};var lb=typeof Symbol==="function"&&typeof Symbol()==="symbol";function mb(a,b,c){return typeof Symbol==="function"&&typeof Symbol()==="symbol"?(c===void 0?0:c)&&Symbol.for&&a?Symbol.for(a):a!=null?Symbol(a):Symbol():b}var nb=mb("jas",void 0,!0),ob=mb(void 0,"0di"),pb=mb(void 0,"1oa"),qb=mb(void 0,Symbol()),rb=mb(void 0,"0ubs"),sb=mb(void 0,"0actk"),tb=mb("m_m","nc",!0);Math.max.apply(Math,pa(Object.values({Mb:1,Kb:2,Hb:4,Vb:8,ec:16,Rb:32,tb:64,Fb:128,Db:256,bc:512,Eb:1024,Gb:2048,Sb:4096,Nb:8192})));var ub={bb:{value:0,configurable:!0,writable:!0,enumerable:!1}},vb=Object.defineProperties,C=lb?nb:"bb",wb,xb=[];D(xb,7);wb=Object.freeze(xb);function yb(a,b){lb||C in a||vb(a,ub);a[C]|=b}function D(a,b){lb||C in a||vb(a,ub);a[C]=b}function zb(a){yb(a,34);return a};var Ab={};function Bb(a,b){return b===void 0?a.g!==Cb&&!!(2&(a.A[C]|0)):!!(2&b)&&a.g!==Cb}var Cb={},Db=Object.freeze({});function Eb(a){a.mc=!0;return a};var Fb=Eb(function(a){return typeof a==="number"}),Gb=Eb(function(a){return typeof a==="string"}),Hb=Eb(function(a){return typeof a==="boolean"}),Ib=Eb(function(a){return typeof a==="bigint"});var Jb=typeof w.BigInt==="function"&&typeof w.BigInt(0)==="bigint";function Kb(a){var b=a;if(Gb(b)){if(!/^\s*(?:-?[1-9]\d*|0)?\s*$/.test(b))throw Error(String(b));}else if(Fb(b)&&!Number.isSafeInteger(b))throw Error(String(b));return Jb?BigInt(a):a=Hb(a)?a?"1":"0":Gb(a)?a.trim()||"0":String(a)} -var Lb=Eb(function(a){return Jb?Ib(a):Gb(a)&&/^(?:-?[1-9]\d*|0)$/.test(a)}),Rb=Eb(function(a){return Jb?a>=Mb&&a<=Nb:a[0]==="-"?Ob(a,Pb):Ob(a,Qb)}),Pb=Number.MIN_SAFE_INTEGER.toString(),Mb=Jb?BigInt(Number.MIN_SAFE_INTEGER):void 0,Qb=Number.MAX_SAFE_INTEGER.toString(),Nb=Jb?BigInt(Number.MAX_SAFE_INTEGER):void 0;function Ob(a,b){if(a.length>b.length)return!1;if(a.lengthe)return!1;if(d>>0;E=b;F=(a-b)/4294967296>>>0}function Tb(a){if(a<0){Sb(0-a);var b=v(Ub(E,F));a=b.next().value;b=b.next().value;E=a>>>0;F=b>>>0}else Sb(a)}function Vb(a,b){b>>>=0;a>>>=0;if(b<=2097151)var c=""+(4294967296*b+a);else kb()?c=""+(BigInt(b)<>>24|b<<8)&16777215,b=b>>16&65535,a=(a&16777215)+c*6777216+b*6710656,c+=b*8147497,b*=2,a>=1E7&&(c+=a/1E7>>>0,a%=1E7),c>=1E7&&(b+=c/1E7>>>0,c%=1E7),c=b+Wb(c)+Wb(a));return c} -function Wb(a){a=String(a);return"0000000".slice(a.length)+a}function Xb(){var a=E,b=F;b&2147483648?kb()?a=""+(BigInt(b|0)<>>0)):(b=v(Ub(a,b)),a=b.next().value,b=b.next().value,a="-"+Vb(a,b)):a=Vb(a,b);return a}function Ub(a,b){b=~b;a?a=~a+1:b+=1;return[a,b]};var Yb=typeof BigInt==="function"?BigInt.asIntN:void 0,Zb=Number.isSafeInteger,$b=Number.isFinite,ac=Math.trunc;function bc(a){if(a==null||typeof a==="number")return a;if(a==="NaN"||a==="Infinity"||a==="-Infinity")return Number(a)}function cc(a){return a.displayName||a.name||"unknown type name"}function dc(a){if(typeof a!=="boolean")throw Error("Expected boolean but got "+za(a)+": "+a);return a}var ec=/^-?([1-9][0-9]*|0)(\.[0-9]+)?$/; -function fc(a){switch(typeof a){case "bigint":return!0;case "number":return $b(a);case "string":return ec.test(a);default:return!1}}function hc(a){return a==null?a:$b(a)?a|0:void 0}function ic(a){if(a==null)return a;if(typeof a==="string"&&a)a=+a;else if(typeof a!=="number")return;return $b(a)?a|0:void 0} -function jc(a){var b=a.length;if(a[0]==="-"?b<20||b===20&&a<="-9223372036854775808":b<19||b===19&&a<="9223372036854775807")return a;if(a.length<16)Tb(Number(a));else if(kb())a=BigInt(a),E=Number(a&BigInt(4294967295))>>>0,F=Number(a>>BigInt(32)&BigInt(4294967295));else{b=+(a[0]==="-");F=E=0;for(var c=a.length,d=0+b,e=(c-b)%6+b;e<=c;d=e,e+=6)d=Number(a.slice(d,e)),F*=1E6,E=E*1E6+d,E>=4294967296&&(F+=Math.trunc(E/4294967296),F>>>=0,E>>>=0);b&&(b=v(Ub(E,F)),a=b.next().value,b=b.next().value,E=a,F=b)}return Xb()} -function kc(a){fc(a);a=ac(a);if(!Zb(a)){Tb(a);var b=E,c=F;if(a=c&2147483648)b=~b+1>>>0,c=~c>>>0,b==0&&(c=c+1>>>0);var d=c*4294967296+(b>>>0);b=Number.isSafeInteger(d)?d:Vb(b,c);a=typeof b==="number"?a?-b:b:a?"-"+b:b}return a}function lc(a){fc(a);a=ac(a);Zb(a)?a=String(a):(Tb(a),a=Xb());return a} -function mc(a,b){b=b===void 0?!1:b;var c=typeof a;if(a==null)return a;if(c==="bigint")return String(Yb(64,a));if(fc(a))return c==="string"?(fc(a),b=ac(Number(a)),Zb(b)?a=String(b):(b=a.indexOf("."),b!==-1&&(a=a.substring(0,b)),a=jc(a))):a=b?lc(a):kc(a),a} -function nc(a){var b=typeof a;if(a==null)return a;if(b==="bigint")return Kb(Yb(64,a));if(fc(a))return b==="string"?(b=ac(Number(a)),Zb(b)?a=Kb(b):(b=a.indexOf("."),b!==-1&&(a=a.substring(0,b)),a=kb()?Kb(Yb(64,BigInt(a))):Kb(jc(a)))):a=Zb(a)?Kb(kc(a)):Kb(lc(a)),a}function oc(a){return a==null||typeof a==="string"?a:void 0}function pc(a,b,c,d){if(a!=null&&a[tb]===Ab)return a;if(!Array.isArray(a))return c?d&2?b[ob]||(b[ob]=qc(b)):new b:void 0;c=a[C]|0;d=c|d&32|d&2;d!==c&&D(a,d);return new b(a)} -function qc(a){a=new a;zb(a.A);return a};function rc(a){return a};function sc(){}function tc(a,b){for(var c in a)!isNaN(c)&&b(a,+c,a[c])}function uc(a){var b=new sc;tc(a,function(c,d,e){b[d]=Array.prototype.slice.call(e)});b.g=a.g;return b}function vc(a,b){b<100||jb(rb,1)};function wc(a,b,c,d){var e=d!==void 0;d=!!d;var f=Ia(qb),g;!e&&lb&&f&&(g=a[f])&&tc(g,vc);f=[];var h=a.length;g=4294967295;var k=!1,l=!!(b&64),m=l?b&128?0:-1:void 0;if(!(b&1)){var t=h&&a[h-1];t!=null&&typeof t==="object"&&t.constructor===Object?(h--,g=h):t=void 0;if(l&&!(b&128)&&!e){k=!0;var r;g=((r=xc)!=null?r:rc)(g-m,m,a,t,void 0)+m}}b=void 0;for(r=0;r=g){var K=r-m,P=void 0;((P=b)!=null?P:b={})[K]=z}else f[r]=z}if(t)for(var ma in t)h=t[ma], -h!=null&&(h=c(h,d))!=null&&(r=+ma,z=void 0,l&&!Number.isNaN(r)&&(z=r+m)>2];l=c[(l&3)<<4|m>>4];m=c[(m&15)<<2|k>>6];k=c[k&63];d[f++]=""+h+l+m+k}h=0;k=e;switch(b.length-g){case 2:h= -b[g+1],k=c[(h&15)<<2]||e;case 1:b=b[g],d[f]=""+c[b>>2]+c[(b&3)<<4|h>>4]+k+e}b=d.join("")}a=a.g=b}return a}return}return a}var Ac=cb?structuredClone:function(a){return wc(a,0,yc)},xc;function zc(a){a=a.A;return wc(a,a[C]|0,yc)};function G(a,b,c){return Bc(a,b,c,2048)} -function Bc(a,b,c,d){d=d===void 0?0:d;if(a==null){var e=32;c?(a=[c],e|=128):a=[];b&&(e=e&-16760833|(b&1023)<<14)}else{if(!Array.isArray(a))throw Error("narr");e=a[C]|0;if(Ma&&1&e)throw Error("rfarr");2048&e&&!(2&e)&&Cc();if(e&256)throw Error("farr");if(e&64)return(e|d)!==e&&D(a,e|d),a;if(c&&(e|=128,c!==a[0]))throw Error("mid");a:{c=a;e|=64;var f=c.length;if(f){var g=f-1,h=c[g];if(h!=null&&typeof h==="object"&&h.constructor===Object){b=e&128?0:-1;g-=b;if(g>=1024)throw Error("pvtlmt");for(var k in h)f= -+k,f1024)throw Error("spvt");e=e&-16760833|(k&1023)<<14}}}D(a,e|64|d);return a}function Cc(){if(Ma)throw Error("carr");jb(sb,5)};function Dc(a,b){if(typeof a!=="object")return a;if(Array.isArray(a)){var c=a[C]|0;a.length===0&&c&1?a=void 0:c&2||(!b||4096&c||16&c?a=Ec(a,c,!1,b&&!(c&16)):(yb(a,34),c&4&&Object.freeze(a)));return a}if(a!=null&&a[tb]===Ab)return b=a.A,c=b[C]|0,Bb(a,c)?a:Fc(a,b,c)?Gc(a,b):Ec(b,c);if(a instanceof db)return a}function Gc(a,b,c){a=new a.constructor(b);c&&(a.g=Cb);a.j=Cb;return a}function Ec(a,b,c,d){d!=null||(d=!!(34&b));a=wc(a,b,Dc,d);d=32;c&&(d|=2);b=b&16769217|d;D(a,b);return a} -function Hc(a){var b=a.A,c=b[C]|0;return Bb(a,c)?Fc(a,b,c)?Gc(a,b,!0):new a.constructor(Ec(b,c,!1)):a}function Ic(a){if(a.g!==Cb)return!1;var b=a.A;b=Ec(b,b[C]|0);yb(b,2048);a.A=b;a.g=void 0;a.j=void 0;return!0}function Jc(a,b){b===void 0&&(b=a[C]|0);b&32&&!(b&4096)&&D(a,b|4096)}function Fc(a,b,c){return c&2?!0:c&32&&!(c&4096)?(D(b,c|2),a.g=Cb,!0):!1};var Kc=Kb(0),Lc={};function H(a,b,c,d,e){Object.isExtensible(a);b=Mc(a.A,b,c,e);if(b!==null||d&&a.j!==Cb)return b}function Mc(a,b,c,d){if(b===-1)return null;var e=b+(c?0:-1),f=a.length-1;if(!(f<1+(c?0:-1))){if(e>=f){var g=a[f];if(g!=null&&typeof g==="object"&&g.constructor===Object){c=g[b];var h=!0}else if(e===f)c=g;else return}else c=a[e];if(d&&c!=null){d=d(c);if(d==null)return d;if(!Object.is(d,c))return h?g[b]=d:a[e]=d,d}return c}} -function Nc(a,b,c){if(!Ic(a)&&Bb(a,a.A[C]|0))throw Error();var d=a.A;Oc(d,d[C]|0,b,c);return a}function Oc(a,b,c,d){var e=c+-1,f=a.length-1;if(f>=0&&e>=f){var g=a[f];if(g!=null&&typeof g==="object"&&g.constructor===Object)return g[c]=d,b}if(e<=f)return a[e]=d,b;if(d!==void 0){var h;f=((h=b)!=null?h:b=a[C]|0)>>14&1023||536870912;c>=f?d!=null&&(e={},a[f+-1]=(e[c]=d,e)):a[e]=d}return b} -function Pc(a,b,c,d,e,f,g,h){var k=b;f===1||(f!==4?0:2&b||!(16&b)&&32&d)?Qc(b)||(b|=!a.length||g&&!(4096&b)||32&d&&!(4096&b||16&b)?2:256,b!==k&&D(a,b),Object.freeze(a)):(f===2&&Qc(b)&&(a=Array.prototype.slice.call(a),k=0,b=Rc(b,d),d=Oc(c,d,e,a)),Qc(b)||(h||(b|=16),b!==k&&D(a,b)));2&b||!(4096&b||16&b)||Jc(c,d);return a}function Sc(a,b){a=Mc(a,b);return Array.isArray(a)?a:wb}function Tc(a,b){2&b&&(a|=2);return a|1}function Qc(a){return!!(2&a)&&!!(4&a)||!!(256&a)} -function Uc(a){return a==null?a:typeof a==="string"?a?new db(a,bb):eb():a.constructor===db?a:$a&&a!=null&&a instanceof Uint8Array?a.length?new db(new Uint8Array(a),bb):eb():void 0}function Vc(a,b,c){return Wc(a,b)===c?c:-1} -function Wc(a,b){a=a.A;if(lb){var c;var d=(c=a[pb])!=null?c:a[pb]=new Map}else pb in a?d=a[pb]:(c=new Map,Object.defineProperty(a,pb,{value:c}),d=c);c=d;d=void 0;var e=c.get(b);if(e==null){for(var f=e=0;f>>0)}p=xd.prototype;p.isSafeInteger=function(){var a=this.G>>21;return a==0||a==-1&&!(this.I==0&&this.G==-2097152)}; -p.toString=function(a){a=a||10;if(a<2||36>2);var c=Math.pow(a,b),d=L(c,c/4294967296);c=this.div(d);var e=Math,f=e.abs;d=c.multiply(d);d=this.add(zd(d));e=f.call(e,yd(d));f=a==10?""+e:e.toString(a);f.length>>0>a.I>>>0?1:-1:this.G>a.G?1:-1};function zd(a){var b=~a.I+1|0;return L(b,~a.G+!b|0)}p.add=function(a){var b=this.G>>>16,c=this.G&65535,d=this.I>>>16,e=a.G>>>16,f=a.G&65535,g=a.I>>>16;a=(this.I&65535)+(a.I&65535);g=(a>>>16)+(d+g);d=g>>>16;d+=c+f;return L((g&65535)<<16|a&65535,((d>>>16)+(b+e)&65535)<<16|d&65535)}; -p.multiply=function(a){if(Ad(this))return this;if(Ad(a))return a;var b=this.G>>>16,c=this.G&65535,d=this.I>>>16,e=this.I&65535,f=a.G>>>16,g=a.G&65535,h=a.I>>>16;a=a.I&65535;var k=e*a;var l=(k>>>16)+d*a;var m=l>>>16;l=(l&65535)+e*h;m+=l>>>16;m+=c*a;var t=m>>>16;m=(m&65535)+d*h;t+=m>>>16;m=(m&65535)+e*g;t=t+(m>>>16)+(b*a+c*h+d*g+e*f)&65535;return L((l&65535)<<16|k&65535,t<<16|m&65535)}; -p.div=function(a){if(Ad(a))throw Error("division by zero");if(this.G<0){if(this.equals(Bd)){if(a.equals(Cd)||a.equals(Dd))return Bd;if(a.equals(Bd))return Cd;var b=this.G;b=L(this.I>>>1|b<<31,b>>1);b=b.div(a).shiftLeft(1);if(b.equals(Ed))return a.G<0?Cd:Dd;var c=a.multiply(b);c=this.add(zd(c));return b.add(c.div(a))}return a.G<0?zd(this).div(zd(a)):zd(zd(this).div(a))}if(Ad(this))return Ed;if(a.G<0)return a.equals(Bd)?Ed:zd(this.div(zd(a)));b=Ed;for(c=this;c.compare(a)>=0;){var d=Math.max(1,Math.floor(yd(c)/ -yd(a))),e=Math.ceil(Math.log(d)/Math.LN2);e=e<=48?1:Math.pow(2,e-48);for(var f=Fd(d),g=f.multiply(a);g.G<0||g.compare(c)>0;)d-=e,f=Fd(d),g=f.multiply(a);Ad(f)&&(f=Cd);b=b.add(f);c=c.add(zd(g))}return b};p.and=function(a){return L(this.I&a.I,this.G&a.G)};p.or=function(a){return L(this.I|a.I,this.G|a.G)};p.xor=function(a){return L(this.I^a.I,this.G^a.G)};p.shiftLeft=function(a){a&=63;if(a==0)return this;var b=this.I;return a<32?L(b<>>32-a):L(0,b<0?a>=0x7fffffffffffffff?Gd:new xd(a,a/4294967296):a<0?a<=-0x7fffffffffffffff?Bd:zd(new xd(-a,-a/4294967296)):Ed}function L(a,b){return new xd(a,b)}var Ed=L(0,0),Cd=L(1,0),Dd=L(-1,-1),Gd=L(4294967295,2147483647),Bd=L(0,2147483648);function Hd(a,b){b=b===void 0?window:b;b=b===void 0?window:b;return(b=b.WIZ_global_data)&&a in b?b[a]:null};var Id; -function Jd(){var a=null;var b=Hd("TSDtV",window);if(b=typeof b!=="string"?null:b)a=wd("["+b.substring(4)),a=Zc(a,ud,1)[0];if(a){b=v(Zc(a,sd,2));for(var c=b.next();!c.done;c=b.next()){c=c.value;var d=c.A;if(Xc(d,d[C]|0,ld,Vc(c,td,6))!==void 0)throw Error();}}if(a)for(b={},c=v(Zc(a,sd,2)),d=c.next();!d.done;d=c.next()){var e=d.value;d=cd(e,1).toString();switch(Wc(e,td)){case 3:b[d]=ad(e,Vc(e,td,3));break;case 2:var f=cd(e,Vc(e,td,2));Lb(f);Rb(f);f=Rb(f)?Number(f):String(f);b[d]=f;break;case 4:f=void 0; -var g=e;var h=Vc(e,td,4);e=void 0;e=e===void 0?0:e;g=(f=H(g,h,void 0,void 0,bc))!=null?f:e;b[d]=g;break;case 5:b[d]=dd(e,Vc(e,td,5));break;case 6:b[d]=I(e,ld,Vc(e,td,6));break;case 8:f=Yc(e,qd,Vc(e,td,8));switch(Wc(f,rd)){case 1:b[d]=dd(f,Vc(f,rd,1));break;default:throw Error("case "+Wc(f,rd));}break;default:throw Error("case "+Wc(e,td));}}else b={};this.g=b;this.j=a?a.za():null}Jd.prototype.za=ba("j");function Kd(a){this.A=G(a)}u(Kd,J);var Ld=new nd;function Md(a){this.A=G(a)}u(Md,J);var Nd=function(a){return function(){return a[ob]||(a[ob]=qc(a))}}(Md);Object.create(null);function M(){}M.prototype.equals=function(a){return Od(this,a)};M.prototype.ra=function(){return this.D||(Object.defineProperties(this,{D:{value:Pd=Pd+1|0,enumerable:!1}}),this.D)};M.prototype.toString=function(){return N(Qd(O(Rd(this))))+"@"+N((this.ra()>>>0).toString(16))};M.prototype.C=["java.lang.Object",0];function Sd(){}u(Sd,M);function Q(a,b){a.g=b;Td(b,a)}function R(a){Ud(a.g)&&(Error.captureStackTrace?Error.captureStackTrace(S(a.g,Ud,Xd)):S(a.g,Ud,Xd).stack=Error().stack)}Sd.prototype.toString=function(){var a=Qd(O(Rd(this))),b=this.j;return b==null?a:N(a)+": "+N(b)};function Yd(a){if(a!=null){var b=a.La;if(b!=null)return b}a instanceof TypeError?b=Zd():(b=new $d,R(b),Q(b,Error(b)));b.j=a==null?"null":a.toString();Q(b,a);return b}function ae(a){return a instanceof Sd} -Sd.prototype.C=["java.lang.Throwable",0];function be(){}u(be,Sd);be.prototype.C=["java.lang.Exception",0];function T(){}u(T,be);T.prototype.C=["java.lang.RuntimeException",0];function ce(){}u(ce,T);ce.prototype.C=["java.lang.IndexOutOfBoundsException",0];var de;function ee(){ee=n();for(var a=fe(),b=0;b<256;b=b+1|0)ge(a,b,he(b-128|0));de=a};function ie(){}u(ie,T);ie.prototype.C=["java.lang.ArithmeticException",0];function je(){}u(je,T);je.prototype.C=["java.lang.ArrayStoreException",0];function ke(){}u(ke,T);ke.prototype.C=["java.lang.ClassCastException",0];function le(){}u(le,T);le.prototype.C=["java.lang.IllegalArgumentException",0];function me(){}u(me,T);function ne(a){var b=new me;b.j=a;R(b);Q(b,Error(b));return b}me.prototype.C=["java.lang.IllegalStateException",0];function $d(){}u($d,T);$d.prototype.C=["java.lang.JsException",0];function oe(){}u(oe,$d);function Zd(){var a=new oe;R(a);Q(a,new TypeError(a));return a}oe.prototype.C=["java.lang.NullPointerException",0];function pe(){}u(pe,ce);pe.prototype.C=["java.lang.StringIndexOutOfBoundsException",0];function qe(){}var re;u(qe,M);qe.prototype.C=["java.lang.Number",0];function se(){}u(se,qe);se.prototype.C=["java.lang.Double",0];function te(a){return Fd(a)}function ue(a){if(!isFinite(a))throw a=new ie,R(a),Q(a,Error(a)),a.g;return a|0};function ve(){}u(ve,M);ve.prototype.C=["java.lang.Boolean",0];function S(a,b,c){if(a!=null&&!b(a))throw a=N(Qd(we(a)))+" cannot be cast to "+N(Qd(O(c))),b=new ke,b.j=a,R(b),Q(b,Error(b)),b.g;return a};function Rd(a){return a.constructor}function xe(a,b,c){if(Object.prototype.hasOwnProperty.call(a.prototype,b))return a.prototype[b];c=c();return a.prototype[b]=c};function Od(a,b){return Object.is(a,b)||a==null&&b==null};var Pd=0;function we(a){switch(U(typeof a)){case "number":return O(se);case "boolean":return O(ve);case "string":return O(ye);case "function":return O(ze)}if(a instanceof xd)a=O(Ae);else if(a instanceof M)a=O(Rd(a));else if(Array.isArray(a))a=(a=a.ma)?O(a.Z,a.Y):O(M,1);else if(a!=null)a=O(Be);else throw new TypeError("null.getClass()");return a};function ze(){}ze.prototype.C=["",1];function Be(){}u(Be,M);Be.prototype.C=["",0];function V(){this.U=0}u(V,qe);function Ce(a){a>-129&&a<128?(ee(),a=de[a+128|0]):a=he(a);return a}function he(a){var b=new V;b.U=a;return b}V.prototype.equals=function(a){return De(a)&&S(a,De,V).U==this.U};V.prototype.ra=ba("U");V.prototype.toString=function(){return""+this.U};function De(a){return a instanceof V}V.prototype.C=["java.lang.Integer",0];function Ae(){}u(Ae,qe);Ae.prototype.C=["java.lang.Long",0];function Ee(){}u(Ee,le);Ee.prototype.C=["java.lang.NumberFormatException",0];function U(a){if(a==null)throw Zd().g;return a};function fe(){var a=[256];return Fe(a,{Z:V,la:De,Y:a.length})}function Fe(a,b){var c=a[0];if(c==null)return null;var d=new globalThis.Array(c);b&&(d.ma=b);if(a.length>1){a=a.slice(1);b=b&&{Z:b.Z,la:b.la,Y:b.Y-1};for(var e=0;e1){d=e.Z;var f=e.la;e=e.Y-1;if(c!=null&&Array.isArray(c)){var g=c.ma||{Z:M,Y:1},h=g.Y;h==e?(e=g.Z,d=e===d?!0:d&&d.prototype.Ca||e&&e.prototype.Ca?!1:f(e.prototype)):d=h>e?M==d:!1}else d=!1;if(!d){d=!1;break a}}else if(c!=null&&!e.la(c)){d=!1;break a}d=!0}if(!d)throw a=new je,R(a),Q(a,Error(a)),a.g;a[b]=c};function ye(){}u(ye,M);function N(a){return a==null?"null":a.toString()}function Ge(a){if(!(a>=0))throw a=new le,R(a),Q(a,Error(a)),a.g;return"0".repeat(a)}ye.prototype.C=["java.lang.String",0];function He(a,b){this.g=a;this.j=b}u(He,M);function O(a,b){var c=b||0;return xe(a,"$$class/"+c,function(){return new He(a,c)})}function Qd(a){return a.j!=0?N(Ie("[",a.j))+N(a.g.prototype.C[1]==3?a.g.prototype.C[2]:"L"+N(a.g.prototype.C[0])+";"):a.g.prototype.C[0]}function Je(a,b){b=a.lastIndexOf(b)+1|0;var c=a.length+1|0;if(b<0||b>=c)throw a=new pe,a.j="Index: "+b+", Size: "+c,R(a),Q(a,Error(a)),a.g;return a.substr(b)} -He.prototype.toString=function(){return String(this.j==0&&this.g.prototype.C[1]==1?"interface ":this.j==0&&this.g.prototype.C[1]==3?"":"class ")+N(Qd(this))};function Ie(a,b){for(var c="",d=0;d>>0).toString(16);b=N(Ge(Math.max(0,8-b.length|0)))+N(b);a=(a(2147483647)>>>0).toString(16);return N(a)+N(b)};function Oe(){}function Pe(a){return a instanceof Array}Oe.prototype.C=["Array",0];function Qe(){}function Re(a){return a instanceof Object}Qe.prototype.C=["Object",0];function Se(){}function Te(a){return a instanceof Object}Se.prototype.C=["Object",0];var Ue={Ob:"build-label",rb:"buildLabel",sb:"clientLog",xb:"docId",Qb:"mobile-app-version",ac:"severity",fc:"severity-unprefixed",Ib:"isArrayPrototypeIntact",Jb:"isEditorElementAttached",Cb:"documentCharacterSet",Lb:"isModuleLoadFailure",Yb:"reportName",Pb:"locale",ub:"createdOnServer",Ub:"numUnsavedCommands",wb:"cspViolationContext",Xb:"relatedToBrowserExtension",jc:"workerError",yb:"docosPostLimitExceeded",zb:"docosPostLimitType",Ab:"docosReactionLimitExceeded",Bb:"docosReactionLimitType",Wb:"origin", -Zb:"saveTakingTooLongOnClient",cc:"truncatedCommentNotificationsCount",dc:"truncatedCommentNotificationsFromPayload",Tb:"nonfatalReason",hc:"usesModuleSetsServing"};function Ve(){this.g=!1}var We;u(Ve,M);p=Ve.prototype;p.dispose=function(){if(this.g)var a=null;else this.g=!0,a=this.o==null?We:this.o,this.o=null;if(a!=null){this.na();if(a.length!=0)for(var b=0;b4);e++)b[cf(a[e])]||(c+="\nInner error "+d++ +": ",a[e].stack&&a[e].stack.indexOf(a[e].toString())==0||(c+=typeof a[e]==="string"?a[e]:a[e].message+"\n"),c+=af(a[e],b));e=0)c.push("[...circular reference...]");else if(a&&b.length<50){c.push(bf(a)+"(");for(var d=a.arguments,e=0;d&&e0&&c.push(", ");var f=d[e];switch(typeof f){case "object":f=f?"object":"null";break;case "string":break;case "number":f=String(f);break;case "boolean":f=f?"true":"false";break;case "function":f=(f=bf(f))?f:"[fn]";break;default:f=typeof f}f.length>40&&(f=f.slice(0,40)+"...");c.push(f)}b.push(a);c.push(")\n");try{c.push(gf(a.caller,b))}catch(g){c.push("[exception trying to get caller]\n")}}else a? -c.push("[...long stack...]"):c.push("[end]");return c.join("")}function bf(a){if(hf[a])return hf[a];a=String(a);if(!hf[a]){var b=/function\s+([^\(]+)/m.exec(a);hf[a]=b?b[1]:"[Anonymous]"}return hf[a]}var hf={};function jf(a,b){this.name=a;this.value=b}jf.prototype.toString=ba("name");var kf=new jf("SEVERE",1E3),lf=new jf("WARNING",900),mf=new jf("CONFIG",700);function nf(){this.clear()}var of;function pf(a){var b=qf(),c=b.g;if(c[0]){var d=b.j;b=b.l?d:-1;do b=(b+1)%0,a(c[b]);while(b!==d)}}nf.prototype.clear=function(){this.g=[];this.j=-1;this.l=!1};function qf(){of||(of=new nf);return of};function rf(a,b,c,d,e,f,g){var h="";a&&(h+=a+":");c&&(h+="//",b&&(h+=b+"@"),h+=c,d&&(h+=":"+d));e&&(h+=e);f&&(h+="?"+f);g&&(h+="#"+g);return h}var sf=RegExp("^(?:([^:/?#.]+):)?(?://(?:([^\\\\/?#]*)@)?([^\\\\/?#]*?)(?::([0-9]+))?(?=[\\\\/?#]|$))?([^?#]+)?(?:\\?([^#]*))?(?:#([\\s\\S]*))?$"); -function tf(a,b){if(a){a=a.split("&");for(var c=0;c=0){var f=a[c].substring(0,d);e=a[c].substring(d+1)}else f=a[c];b(f,e?decodeURIComponent(e.replace(/\+/g," ")):"")}}}function uf(a,b){if(!b)return a;var c=a.indexOf("#");c<0&&(c=a.length);var d=a.indexOf("?");if(d<0||d>c){d=c;var e=""}else e=a.substring(d+1,c);a=[a.slice(0,d),e,a.slice(c)];c=a[1];a[1]=b?c?c+"&"+b:b:c;return a[0]+(a[1]?"?"+a[1]:"")+a[2]} -function vf(a,b,c){if(Array.isArray(b))for(var d=0;d0){this.j--;var a=this.g;this.g=a.next;a.next=null}else a=this.l();return a};function Ff(a,b){a.o(b);a.j<100&&(a.j++,b.next=a.g,a.g=b)};var Gf=[],Hf=[],If=!1;function Jf(a){Gf[Gf.length]=a;if(If)for(var b=0;b1)));g=g.next)e||(f=g);e&&(c.g==0&&d==1?jg(c,b):(f?(d=f,d.next==c.o&&(c.o=d),d.next=d.next.next):kg(c),lg(c,e,3,b)))}a.l=null}else Vf(a,3,b)}function mg(a,b){a.j||a.g!=2&&a.g!=3||ng(a);a.o?a.o.next=b:a.j=b;a.o=b} -function hg(a,b,c,d){var e=Yf(null,null,null);e.g=new X(function(f,g){e.o=b?function(h){try{var k=b.call(d,h);f(k)}catch(l){g(l)}}:f;e.j=c?function(h){try{var k=c.call(d,h);k===void 0&&h instanceof ig?g(h):f(k)}catch(l){g(l)}}:g});e.g.l=a;mg(a,e);return e.g}p.nb=function(a){this.g=0;Vf(this,2,a)};p.ob=function(a){this.g=0;Vf(this,3,a)}; -function Vf(a,b,c){a.g==0&&(a===c&&(b=3,c=new TypeError("Promise cannot resolve to itself")),a.g=1,bg(c,a.nb,a.ob,a)||(a.J=c,a.g=b,a.l=null,ng(a),b!=3||c instanceof ig||og(a,c)))}function bg(a,b,c,d){if(a instanceof X)return mg(a,Yf(b||Tf,c||null,d)),!0;if(Uf(a))return a.then(b,c,d),!0;if(Ba(a))try{var e=a.then;if(typeof e==="function")return pg(a,e,b,c,d),!0}catch(f){return c.call(d,f),!0}return!1} -function pg(a,b,c,d,e){function f(k){h||(h=!0,d.call(e,k))}function g(k){h||(h=!0,c.call(e,k))}var h=!1;try{b.call(a,g,f)}catch(k){f(k)}}function ng(a){a.v||(a.v=!0,Qf(a.Ua,a))}function kg(a){var b=null;a.j&&(b=a.j,a.j=b.next,b.next=null);a.j||(a.o=null);return b}p.Ua=function(){for(var a;a=kg(this);)lg(this,a,this.g,this.J);this.v=!1}; -function lg(a,b,c,d){if(c==3&&b.j&&!b.D)for(;a&&a.D;a=a.l)a.D=!1;if(b.g)b.g.l=null,qg(b,c,d);else try{b.D?b.o.call(b.l):qg(b,c,d)}catch(e){rg.call(null,e)}Ff(Xf,b)}function qg(a,b,c){b==2?a.o.call(a.l,c):a.j&&a.j.call(a.l,c)}function og(a,b){a.D=!0;Qf(function(){a.D&&rg.call(null,b)})}var rg=Ja;function ig(a){A.call(this,a);this.g=!1}y(ig,A);ig.prototype.name="cancel";function gg(a,b,c){this.promise=a;this.resolve=b;this.reject=c};/* - - Copyright 2005, 2007 Bob Ippolito. All Rights Reserved. - Copyright The Closure Library Authors. - SPDX-License-Identifier: MIT -*/ -function sg(){this.D=[];this.o=this.l=!1;this.j=void 0;this.F=this.K=this.J=!1;this.v=0;this.g=null;this.B=0}sg.prototype.cancel=function(a){if(this.l)this.j instanceof sg&&this.j.cancel();else{if(this.g){var b=this.g;delete this.g;a?b.cancel(a):(b.B--,b.B<=0&&b.cancel())}this.F=!0;this.l||(a=new tg(this),ug(this),vg(this,!1,a))}};sg.prototype.H=function(a,b){this.J=!1;vg(this,a,b)};function vg(a,b,c){a.l=!0;a.j=c;a.o=!b;wg(a)}function ug(a){if(a.l){if(!a.F)throw new xg(a);a.F=!1}} -function yg(a){throw a;}function zg(a,b,c){return Ag(a,b,null,c)}function Bg(a,b,c){Ag(a,b,function(d){var e=b.call(this,d);if(e===void 0)throw d;return e},c)}function Ag(a,b,c,d){var e=a.l;e||(b===c?b=c=Df(b):(b=Df(b),c=Df(c)));a.D.push([b,c,d]);e&&wg(a);return a}sg.prototype.then=function(a,b,c){var d,e,f=new X(function(g,h){e=g;d=h});Ag(this,e,function(g){g instanceof tg?f.cancel():d(g);return Cg},this);return f.then(a,b,c)};sg.prototype.$goog_Thenable=!0; -function Dg(a){return Ta(a.D,function(b){return typeof b[1]==="function"})}var Cg={}; -function wg(a){if(a.v&&a.l&&Dg(a)){var b=a.v,c=Eg[b];c&&(w.clearTimeout(c.g),delete Eg[b]);a.v=0}a.g&&(a.g.B--,delete a.g);b=a.j;for(var d=c=!1;a.D.length&&!a.J;){var e=a.D.shift(),f=e[0],g=e[1];e=e[2];if(f=a.o?g:f)try{var h=f.call(e||null,b);h===Cg&&(h=void 0);h!==void 0&&(a.o=a.o&&(h==b||h instanceof Error),a.j=b=h);if(Uf(b)||typeof w.Promise==="function"&&b instanceof w.Promise)d=!0,a.J=!0}catch(k){b=k,a.o=!0,Dg(a)||(c=!0)}}a.j=b;d&&(h=x(a.H,a,!0),d=x(a.H,a,!1),b instanceof sg?(Ag(b,h,d),b.K=!0): -b.then(h,d));c&&(b=new Gg(b),Eg[b.g]=b,a.v=b.g)}function Hg(a){var b=new sg;ug(b);vg(b,!0,a);return b}function xg(){A.call(this)}y(xg,A);xg.prototype.message="Deferred has already fired";xg.prototype.name="AlreadyCalledError";function tg(){A.call(this)}y(tg,A);tg.prototype.message="Deferred was canceled";tg.prototype.name="CanceledError";function Gg(a){this.g=w.setTimeout(x(this.l,this),0);this.j=a}Gg.prototype.l=function(){delete Eg[this.g];yg(this.j)};var Eg={};function Ig(){}function Jg(a){return a!=null&&!!a.wa}Ig.prototype.wa=!0;Ig.prototype.C=["javax.inject.Provider",1];function Kg(){}function Lg(a){return a!=null&&!!a.va}Kg.prototype.va=!0;Kg.prototype.C=["com.google.apps.docs.xplat.flag.FlagService",1];var Mg;function Ng(){if(Mg==null){var a=new Og(null);Mg=function(){return a}}var b;return S((b=Mg,b()),Lg,Kg)};function Pg(){}u(Pg,M);Pg.prototype.get=function(){if(this.j==null){var a=S(w._docs_flag_initialData,Re,Qe);this.j=a!=null?a:S({},Re,Qe)}return this.j};Pg.prototype.g=function(){return this.get()};Pg.prototype.wa=!0;Pg.prototype.C=["com.google.apps.docs.xplat.flag.FlagServiceHelper",0];function Qg(a){return typeof a=="string"?a=="true"||a=="1":!!a};function Og(a){this.g=new Pg;this.j=null;if(a!=null)for(var b in a){var c=b,d=a[b];if(this.j!=null)throw ne("Cannot use setClientFlag when comparison is enabled.").g;var e=S(this.g.g(),Re,Qe);De(d)?(d=S(d,De,V).U,e[c]=d):e[c]=d!=null?d:null}}u(Og,M);Og.prototype.clear=function(){this.g=new Pg;this.j=null};Og.prototype.get=function(a){Rg(this,a);return S(this.g.g(),Re,Qe)[a]};function Sg(a,b){a=S(a.g.g(),Re,Qe);return b in a} -function Tg(a,b){Rg(a,b);if(!Sg(a,b)||a.get(b)==null)return NaN;try{var c=N(a.get(b));re==null&&(re=RegExp("^\\s*[+-]?(NaN|Infinity|((\\d+\\.?\\d*)|(\\.\\d+))([eE][+-]?\\d+)?[dDfF]?)\\s*$"));if(!re.test(c)){var d=new Ee;d.j='For input string: "'+N(c)+'"';R(d);Q(d,Error(d));throw d.g;}return parseFloat(c)}catch(f){var e=Yd(f);if(e instanceof Ee)return NaN;throw e.g;}} -function Ug(a,b){Rg(a,b);if(!Sg(a,b))return"";a=a.get(b);if(a==null)a="";else{if(b="number"===typeof a){b=te(U(a));var c=te(U(a));b=b.equals(c)}a=b?""+te(U(a)):N(a)}return a} -function Rg(a,b){if(a.j!=null){try{var c=S(a.g.g(),Re,Qe)[b]}catch(h){var d=Yd(h);if(d instanceof T)c="injection-failed";else throw d.g;}try{var e=a.j;if(e==null)throw Zd().g;var f=S(S(e,Jg,Ig).g(),Re,Qe)[b]}catch(h){var g=Yd(h);if(g instanceof T)f="injection-failed";else throw g.g;}a=c;!(b=Od(a,f))&&(b=a!=null)&&(b=a.equals?a.equals(f):Object.is(a,f));if(!b)throw ne("Logging is not supported.").g;}}Og.prototype.va=!0;Og.prototype.C=["com.google.apps.docs.xplat.flag.FlagServiceImpl",0];function Vg(a){Ke.call(this,a,null);Q(this,Error(this))}u(Vg,Ke);Vg.prototype.C=["com.google.apps.docs.xplat.net.LimitException",0];function Wg(a,b,c,d){Xe();this.g=!1;this.v=a;this.l=b;this.j=new Xg(Math.imul(c,1E3),d)}u(Wg,Ve);function Yg(a){if(!((a.j.get(null)+1|0)/U(a.j.l/1E3)<=a.l))throw(new Vg("Query would cause "+N(a.v)+" to exceed "+a.l+" qps.")).g;a=a.j;var b=yd(Fd(Date.now()));Zg(a,b);var c=S($g(a.g),ah,bh);if(c==null||U(b)>=U(c.j))b=ch(a,U(b)),c=new bh,c.j=b,c.g=0,c.o=2147483647,c.l=-2147483648,a.g.add(c);c.g=c.g+1|0;c.o=Math.min(1,c.o);c.l=Math.max(1,c.l)} -Wg.prototype.C=["com.google.apps.docs.xplat.net.QpsLimiter",0];function bh(){this.l=this.o=this.g=0}u(bh,M);function ah(a){return a instanceof bh}bh.prototype.C=["com.google.apps.docs.xplat.util.BasicStat$Slot",0];function Xg(a){this.j=0;this.l=a;this.j=ue(a/50);this.g=new dh(Ce(50))}u(Xg,M);Xg.prototype.get=function(a){return eh(this,a,function(b,c){b=S(b,De,V);c=S(c,ah,bh);return Ce(b.U+c.g|0)})};function eh(a,b,c){b=b!=null?U(b):yd(Fd(Date.now()));Zg(a,b);var d=0;b=ch(a,U(b));b=U(b)-a.l;for(var e=a.g.g.length-1|0;e>=0;e=e-1|0){var f=S(a.g.get(e),ah,bh);if(U(f.j)<=b)break;d=S(c(Ce(d),f),De,V).U}return d}function ch(a,b){return a.j*Math.floor(b/a.j+1)} -function Zg(a,b){var c=S($g(a.g),ah,bh);c!=null&&(c=U(c.j)-a.j,U(b)=a.g.length)throw a=new ce,R(a),Q(a,Error(a)),a.g;return a.g.length1||f.length==1&& -f[0]!="")&&f.pop(),d&&g==e.length&&f.push("")):(f.push(h),d=!0)}d=f.join("/")}else d=e}c?vh(b,d):c=a.l.toString()!=="";c?wh(b,a.l.clone()):c=!!a.v;c&&(b.v=a.v);return b};sh.prototype.clone=function(){return new sh(this)};function th(a,b,c){a.o=c?xh(b,!0):b;a.o&&(a.o=a.o.replace(/:$/,""));return a}function uh(a,b){if(b){b=Number(b);if(isNaN(b)||b<0)throw Error("Bad port number "+b);a.B=b}else a.B=null}function vh(a,b,c){a.j=c?xh(b,!0):b;return a} -function wh(a,b,c){b instanceof yh?(a.l=b,Eh(a.l,a.D)):(c||(b=zh(b,Fh)),a.l=new yh(b,a.D))}function Gh(a,b,c){a.l.set(b,c);return a}function xh(a,b){return a?b?decodeURI(a.replace(/%25/g,"%2525")):decodeURIComponent(a):""}function zh(a,b,c){return typeof a==="string"?(a=encodeURI(a).replace(b,Hh),c&&(a=a.replace(/%25([0-9a-fA-F]{2})/g,"%$1")),a):null}function Hh(a){a=a.charCodeAt(0);return"%"+(a>>4&15).toString(16)+(a&15).toString(16)}var Ah=/[#\/\?@]/g,Ch=/[#\?:]/g,Bh=/[#\?]/g,Fh=/[#\?@]/g,Dh=/#/g; -function yh(a,b){this.j=this.g=null;this.l=a||null;this.o=!!b}function Ih(a){a.g||(a.g=new Map,a.j=0,a.l&&tf(a.l,function(b,c){a.add(decodeURIComponent(b.replace(/\+/g," ")),c)}))}p=yh.prototype;p.add=function(a,b){Ih(this);this.l=null;a=Jh(this,a);var c=this.g.get(a);c||this.g.set(a,c=[]);c.push(b);this.j=this.j+1;return this};p.remove=function(a){Ih(this);a=Jh(this,a);return this.g.has(a)?(this.l=null,this.j=this.j-this.g.get(a).length,this.g.delete(a)):!1}; -p.clear=function(){this.g=this.l=null;this.j=0};function Kh(a,b){Ih(a);b=Jh(a,b);return a.g.has(b)}p.forEach=function(a,b){Ih(this);this.g.forEach(function(c,d){c.forEach(function(e){a.call(b,e,d,this)},this)},this)};p.qa=function(a){Ih(this);var b=[];if(typeof a==="string")Kh(this,a)&&(b=b.concat(this.g.get(Jh(this,a))));else{a=Array.from(this.g.values());for(var c=0;c0?String(a[0]):b}; -p.toString=function(){if(this.l)return this.l;if(!this.g)return"";for(var a=[],b=Array.from(this.g.keys()),c=0;c0)){this.l=null;d=this.g;var f=d.set;e=Jh(this,e);var g=c.length;if(g>0){for(var h=Array(g),k=0;k-1?(b=a[g],c||(b.fa=!1)):(b=new Sh(b,this.src,f,!!d,e),b.fa=c,a.push(b));return b};Uh.prototype.remove=function(a,b,c,d){a=a.toString();if(!(a in this.g))return!1;var e=this.g[a];b=Vh(e,b,c,d);return b>-1?(Th(e[b]),Array.prototype.splice.call(e,b,1),e.length==0&&(delete this.g[a],this.j--),!0):!1}; -function Wh(a,b){var c=b.type;c in a.g&&Ua(a.g[c],b)&&(Th(b),a.g[c].length==0&&(delete a.g[c],a.j--))}Uh.prototype.removeAll=function(a){a=a&&a.toString();var b=0,c;for(c in this.g)if(!a||c==a){for(var d=this.g[c],e=0;e-1?b[a]:null)&&ii(c))} -function ii(a){if(typeof a!=="number"&&a&&!a.removed){var b=a.src;if(b&&b[Qh])Wh(b.j,a);else{var c=a.type,d=a.proxy;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(fi(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Zh--;(c=di(b))?(Wh(c,a),c.j==0&&(c.src=null,b[Xh]=null)):Th(a)}}}function fi(a){return a in Yh?Yh[a]:Yh[a]="on"+a} -function gi(a,b){if(a.removed)a=!0;else{b=new Ph(b,this);var c=a.listener,d=a.ja||a.src;a.fa&&ii(a);a=c.call(d,b)}return a}function di(a){a=a[Xh];return a instanceof Uh?a:null}var ji="__closure_events_fn_"+(Math.random()*1E9>>>0);function bi(a){if(typeof a==="function")return a;a[ji]||(a[ji]=function(b){return a.handleEvent(b)});return a[ji]}Jf(function(a){gi=a(gi)});function ki(a,b){Nh.call(this,a);this.error=b}u(ki,Nh);var li=/\/d\/([^\/]+)/,mi=/\/r\/([^\/]+)/;function ni(a){a=a.match(sf)[5]||null;return li.test(a)}function oi(a,b){if(ni(a)){ni(a);a=a.match(sf);var c=a[5];c=c.replace(b,"");b=rf(a[1],a[2],a[3],a[4],c,a[6],a[7])}else b=a;return b};function Z(){W.call(this);this.j=new Uh(this);this.Da=this;this.P=null}y(Z,W);Z.prototype[Qh]=!0;p=Z.prototype;p.addEventListener=function(a,b,c,d){$h(this,a,b,c,d)};p.removeEventListener=function(a,b,c,d){hi(this,a,b,c,d)}; -p.dispatchEvent=function(a){var b=this.P;if(b){var c=[];for(var d=1;b;b=b.P)c.push(b),++d}b=this.Da;d=a.type||a;if(typeof a==="string")a=new Nh(a,b);else if(a instanceof Nh)a.target=a.target||b;else{var e=a;a=new Nh(d,b);rh(a,e)}e=!0;var f;if(c)for(f=c.length-1;!a.j&&f>=0;f--){var g=a.currentTarget=c[f];e=pi(g,d,!0,a)&&e}a.j||(g=a.currentTarget=b,e=pi(g,d,!0,a)&&e,a.j||(e=pi(g,d,!1,a)&&e));if(c)for(f=0;!a.j&&f2147483647?-1:w.setTimeout(a,b||0)}function ri(){var a=null;return(new X(function(b,c){a=qi(function(){b(void 0)},2E3);a==-1&&c(Error("Failed to schedule timer."))})).V(function(b){w.clearTimeout(a);throw b;})};function si(a,b,c){W.call(this);this.g=a;this.l=b||0;this.j=c;this.o=x(this.Sa,this)}y(si,W);p=si.prototype;p.ba=0;p.L=function(){si.T.L.call(this);this.stop();delete this.g;delete this.j};p.start=function(a){this.stop();this.ba=qi(this.o,a!==void 0?a:this.l)};p.stop=function(){this.isActive()&&w.clearTimeout(this.ba);this.ba=0};p.isActive=function(){return this.ba!=0};p.Sa=function(){this.ba=0;this.g&&this.g.call(this.j)};function ti(a,b,c,d){W.call(this);this.l=d!=null?d:.15;this.v=a;this.o=b;this.F=c;this.g=new si(this.jb,void 0,this);this.B=Number.NEGATIVE_INFINITY;this.j=0}u(ti,W);p=ti.prototype;p.isActive=function(){return this.g.isActive()};p.start=function(){ui(this,!1,!1)};function ui(a,b,c){b&&(a.g.stop(),vi(a,a.o));a.isActive()||(b=Math.max(0,a.B+a.j-Date.now()),b==0&&(c?b=vi(a,a.o):a.j=0),a.g.start(b))}p.stop=function(){this.g.stop()}; -function vi(a,b){b>0&&a.l!=0&&(b=Math.floor(b*(1-a.l+Math.random()*a.l*2)));return a.j=b}p.jb=function(){this.B=Date.now();vi(this,Math.min(Math.max(this.j*2,this.o),this.F));this.v()};p.L=function(){this.g.dispose();delete this.g;delete this.v;W.prototype.L.call(this)};function wi(a){W.call(this);this.j=a;this.g={}}y(wi,W);var xi=[];wi.prototype.listen=function(a,b,c,d){Array.isArray(b)||(b&&(xi[0]=b.toString()),b=xi);for(var e=0;e=3&&(h.S= -(jh(),ih));h.l.getState().g>=3||h.S!==(jh(),ih)||zi(h)});this.R=g;this.K=Qg(this.O.get("docs-epfdfjes"));this.da={}}u(yi,W);p=yi.prototype;p.send=function(a,b,c,d){Qg(this.O.get("docs-dafjera"))&&(a=oi(oi(a,mi),li));var e=zg(zg(Hg(this.o.length),function(f){if(!(f>=this.ea))return this.R&&(a=yf(a,"errorSender_enqueueTimeMs",Date.now().toString())),f={},f.u=a,f.m=b,f.c=c,f.h=d,this.enqueue(f)},this),this.sa,this);Bg(e,function(){this.P.delete(e)},this);this.P.add(e)}; -p.sa=function(){var a=this.l&&this.l.getState().g>=3,b=this.ka()||this.g.isActive()||this.j.isActive()||this.N;return a||b?Hg():Ai(this)};function Ai(a){return function(){return zg(Hg(a.o[0]!==void 0?a.o[0]:null),function(b){return Bi(a,b)})}()} -function Bi(a,b){if(a.j.isActive()||a.g.isActive()||a.N)return Hg();if(!b)return a.j.stop(),Hg();if(b.u.length>4E3)return Ci(a);try{Yg(a.X);a.H=new sg;var c=b.u;a.ca!=null&&(c=yf(c,"reportingSessionId",a.ca));a.v>0&&(c=yf(c,"retryCount",a.v));a.B!=null&&(c=yf(c,"previousErrorSendStatus",a.B));a.R&&(c=yf(c,"errorSenderType",a.ya()),b.errorSender_frontIndex&&(c=yf(c,"errorSender_frontIndex",b.errorSender_frontIndex)),b.errorSender_nextIndex&&(c=yf(c,"errorSender_nextIndex",b.errorSender_nextIndex)), -b.errorSender_queueSize&&(c=yf(c,"errorSender_queueSize",b.errorSender_queueSize)));var d=Hg();a.K&&(a.da=b,d=Ci(a));var e=b.m,f=b.c,g=b.h;return zg(zg(d,function(){a.g.send(c,e,f,g)}),function(){return a.H})}catch(h){if(Ye(h)instanceof Vg)a.N=!0;else throw ff(h,{"docs-origin-class":"docs.debug.ErrorSender"});}return Hg()} -p.Za=function(){var a=Di(this.g),b=this.H,c=Ei(this.g)||a>=400&&a<=500,d=this.v>3;c||d?(this.v=0,this.B=null,this.j.stop(),zg(this.K?Hg():Ci(this),function(){ug(b);vg(b,!0)})):(this.v++,this.B=a===-1?this.g.B:a,zi(this),this.K&&this.enqueue(this.da),ug(b),vg(b,!0))};function zi(a){a.v!=1||a.j.isActive()?a.j.start():ui(a.j,!0,!0)}p.L=function(){Bf(this.F,this.j,this.g,this.M);this.P.clear();W.prototype.L.call(this)};p.ya=ca("BaseErrorSender");function Fi(a,b,c,d,e){yi.call(this,a,b,c,void 0,d,e,void 0);this.o=[]}u(Fi,yi);Fi.prototype.enqueue=function(a){this.o.push(a);return Hg()};function Ci(a){a.o.shift();return Hg()}Fi.prototype.ya=ca("MemoryErrorSender");Fi.prototype.L=function(){delete this.o;yi.prototype.L.call(this)};function Gi(a){this.g=jd(Nd(),Ac(a));a=bd(this.g,1);this.j=Math.floor(Math.random()*100) \\d+"),RegExp("getReadMode(Config|Render|Extract)")],aj=[RegExp("@file:///|phantomjs|node:electron|py-scrap|eval code|Program Files")],bj=[RegExp("Script https://meet\\.google\\.com/.*meetsw.*load failed"),RegExp("A bad HTTP response code \\(\\d+\\) was received when fetching the script")], -cj=[RegExp("Error loading.*Consecutive load failures"),RegExp("Failed to load module.*Consecutive load failures")];function dj(a,b){this.oa=a;this.ha=b}function ej(a,b){return(b=a.g(b))?{oa:a.oa,ha:a.ha,ua:b.toUpperCase()}:null};function fj(){dj.call(this,1,1)}u(fj,dj);fj.prototype.g=function(a){a:{a=gj(a);for(var b=!1,c=v(Zi),d=c.next();!d.done;d=c.next()){d=a.matchAll(d.value);d=v(d);for(var e=d.next();!e.done;e=d.next())if(e=e.value[1]){if(Yi.includes(e)){a=!1;break a}b=!0}}a=b}return a?"warning":null};function hj(a,b,c,d){this.message=a;this.g=b;this.cause=c;this.j=d}function ij(a){return(a=a.cause)?a.message+"\n"+a.g+"\n"+ij(a):""}function gj(a){return a.message+"\n"+a.g+"\n"+ij(a)}function jj(){this.j=this.g=this.message=""}function kj(a,b){a.message=b;return a};function lj(a){return a instanceof Error||a&&a.message!==void 0?a.message:mj(a)}function nj(a){return a instanceof Error||a&&a.stack!==void 0?a.stack||"":""}function oj(a,b){var c=a&&a.cause!==void 0;if(b>=3||!c)return null;c=new jj;a=a.cause;if(a instanceof Error||a.message!==void 0&&a.stack!==void 0){if(kj(c,lj(a)),c.g=nj(a),b=oj(a,b+1))c.cause=b}else kj(c,mj(a));return new hj(c.message,c.g,c.cause,c.j)} -function mj(a){try{return a&&a instanceof Object?JSON.stringify(a):String(a)}catch(b){return String(a)}}function pj(a,b){var c=kj(new jj,lj(a));c.g=nj(a);if(a=oj(a,0))c.cause=a;b&&(c.j=b);return new hj(c.message,c.g,c.cause,c.j)};function qj(a,b,c,d){dj.call(this,c,d);this.j=a;this.l=b}u(qj,dj);qj.prototype.g=function(a){var b=ij(a);return rj(a.message,this.j)||rj(a.g,this.l)||rj(b,this.j)||rj(b,this.l)?"warning":null};function rj(a,b){b=v(b);for(var c=b.next();!c.done;c=b.next())if(c.value.test(a))return!0;return!1};function sj(a,b,c,d,e){dj.call(this,c,d);this.j=a;this.o=b;this.l=e}u(sj,dj);sj.prototype.g=function(a){if(this.l)a:{a=a.message;for(var b=v(this.j),c=b.next();!c.done;c=b.next())if(a===c.value){a=!0;break a}a=!1}else a=gj(a),a=tj(a,this.j)||tj(a,this.o);return a?"warning":null};function tj(a,b){b=v(b);for(var c=b.next();!c.done;c=b.next())if(a.includes(c.value))return!0;return!1}function uj(a,b,c,d){return new sj(a,b,c,d,!1)};var vj=[new fj,uj("Trusted Type;TrustedHTML;TrustedScript;cannot communicate with background;zaloJSV2;kaspersky-labs;@user-script;Object Not Found Matching Id;contextChanged;Not implemented on this platform;Extension context invalidated;neurosurgeonundergo;realTimeClData;Failed to execute 'querySelectorAll' on 'Document';Promise.all(...).then(...).catch(...).finally is not a function;Error executing Chrome API, chrome.tabs;Identifier 'originalPrompt' has already been declared;User rejected the request;Could not inject ethereum provider because it's not your default extension;Cannot redefine property: googletag;Can't find variable: HTMLDialogElement;Identifier 'listenerName' has already been declared;Cannot read properties of undefined (reading 'info');Permission denied to access property \"type\";Error: Promise timed out;Request timeout ToolbarStatus;Can't find variable: nc;imtgo;ton is not a function;__renderMessageNode is not defined;Cannot redefine property: ethereum;unknown action:;Receiving end does not exist;get-frame-manager-configuration;Key not found;'isAWS'".split(";"), -"puppeteer-core;kaspersky-labs;@user-script;jsQuilting;linkbolic;neurosurgeonundergo;tlscdn;https://cdnjs.cloudflare.com/ajax/libs/mathjax/;secured-pixel.com;Can't find variable: nc;imtgo;_simulateEvent;goguardian".split(";"),1,0),new qj(Xi,Wi,1,0),uj('status is 0, navigator.onLine =;Network sync is disabled. Aborting a network request of int type;The service is currently unavailable.;Internal error encountered.;data does not exist in AF cache;There was an error during the transport or processing of this request;Failed to load gapi;Rpc failed due to xhr error. error code: 6, error: [0];An interceptor has requested that the request be retried;8,"generic";A network error occurred'.split(";"), -Vi,2,0),new qj($i,aj,3,0),uj("Kg is not defined;uncaught error;The play method is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.;Illegal invocation;Script error;zCommon;can't access dead object;Java exception was raised during method invocation;pauseVideo is not a function;ResizeObserver loop;wallet must has at least one account;xbrowser is not defined;jQuery is not defined;Cannot read properties of null (reading 'requestAnimationFrame');Class extends value undefined is not a constructor or null;GM3TooltipService: No tooltip with id;Mole was disposed;getInitialTopicListResponse is missing for stream rendering;getPeopleById call preempted;The operation is insecure;class heritage;The play() request was interrupted;args.site.enabledFeatures is undefined;frappe is not defined;Cannot set properties of undefined (setting 'hidden');Identifier 'checkOngoingMeeting' has already been declared;AutofillCallbackHandler;invalid wire type;zp_token;isReCreate;HTMLOUT is not defined;Shopify root is null;CanvasMaskingStrategy_Redact;_chromeNamespace;feature named `performanceMetrics`;feature named `webCompat`;enableDidUserTypeOnKeyboardLogging;Cannot redefine property: webdriver".split(";"), -["postUserData"],3,0),new qj(bj,Wi,5,0),uj("Service worker registration is disabled by MDA;An unknown error occurred when fetching the script;Operation has been aborted;Timed out while trying to start the Service Worker;The Service Worker system has shutdown;The user denied permission to use Service Worker;The script resource is behind a redirect, which is disallowed;The document is in an invalid state;ServiceWorker script evaluation failed;ServiceWorker cannot be started;Failed to access storage;Worker disallowed;encountered an error during installation".split(";"), -Vi,5,0),new qj(cj,cj,4,0),uj(["Timeout reached for loading script https://www.gstatic.com/_/apps-fileview/_/js/","Error while loading script https://www.gstatic.com/_/apps-fileview/_/js/"],Vi,4,0)],wj=new Set(["SEVERE","SEVERE_AFTER_INITIAL","UNKNOWN","FATAL",""]);function xj(a){this.j=a;this.g=!1} -function yj(a,b){var c="missing",d=new Map,e=!0;try{c=b.j;a.g&&d.set("apps_telemetry.after_downgraded_severe","true");for(var f=v(a.j),g=f.next();!g.done;g=f.next()){var h=g.value;try{var k=ej(h,b);if(k){var l=c,m=zj(a,c)?k.ua:c;Aj(k,l,m).forEach(function(r,z){d.set(z,r)});c=m;break}}catch(r){e=!1;var t=pj(r,c);d.set("apps_telemetry.handling_error",gj(t)+"\n\nclassifier: "+h.constructor.name)}}}catch(r){e=!1,a=pj(r,c),d.set("apps_telemetry.handling_error",gj(a))}d.set("apps_telemetry.processed",String(e)); -return{ua:c,Ta:d}}function Aj(a,b,c){var d=new Map;d.set("apps_telemetry.classification",a.oa.toString());d.set("apps_telemetry.classification_code",a.ha?a.ha.toString():"");d.set("apps_telemetry.incoming_severity",b);d.set("apps_telemetry.outgoing_severity",c);return d}function zj(a,b){return wj.has(b.toUpperCase())?a.g=!0:!1};function Bj(){}Bj.prototype.aa=function(){if("WorkerGlobalScope"in w&&self instanceof w.WorkerGlobalScope)return new Map;try{var a=Array.from(document.querySelectorAll("script")).filter(this.j).slice(0,30).map(this.g).join("\n")}catch(b){a="Error getting cross-origin scripts"}return(new Map).set("apps_telemetry.cross_origin_scripts",a)}; -Bj.prototype.j=function(a){var b=new RegExp(/^(?:https?:\/\/)?(?:[a-zA-Z0-9-]+\.)*google\.com(?:$|[\/#?])/);return(a=a.getAttribute("src"))?!(a.startsWith("/")||b.test(a)):!1};Bj.prototype.g=function(a){return a.innerHTML?a.outerHTML.slice(0,a.outerHTML.indexOf(a.innerHTML)):a.outerHTML};function Cj(){}Cj.prototype.aa=function(){try{var a=performance.getEntriesByType("resource").slice(-5).map(function(b){return zf(b.name)}).join("\n")}catch(b){a="Error getting last 5 resources"}return(new Map).set("apps_telemetry.resources",a)};/* - -Math.uuid.js (v1.4) -http://www.broofa.com -mailto:robert@broofa.com -Copyright (c) 2010 Robert Kieffer -Dual licensed under the MIT and GPL licenses. -*/ -var Dj="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");function Ej(a,b,c){a=a===void 0?[]:a;b=b===void 0?[]:b;c=c===void 0?[]:c;var d=a;a=[Error("uncaught error").message];var e=[];if(b.length>0){var f=e.push,g=[];b=v(b);for(var h=b.next();!h.done;h=b.next())g.push(new RegExp(h.value));f.call(e,new qj(g,g,7,0))}e.push.apply(e,pa(vj));d=v(d);for(f=d.next();!f.done;f=d.next())e.push(f.value);a.length>0&&e.push(new sj(a,[],3,5,!0));this.l=new xj(e);this.g=[new Ri,new Bj,new Cj];this.g.push.apply(this.g,pa(c));c=[];c[8]=c[13]=c[18]=c[23]="-";c[14]="4";for(a= -0;a<36;a++)c[a]||(e=0|Math.random()*16,c[a]=Dj[a==19?e&3|8:e]);this.j=c.join("")}function Fj(a,b,c,d){d["apps_telemetry.session_id"]=a.j;"apps_telemetry.processed"in d&&(d["apps_telemetry.multi_processed"]="true");var e=a.aa();(a=Gj(a,b,c,e))&&Hj(e,a.Ta);e.forEach(function(g,h){d[h]=g});var f;return(f=a==null?void 0:a.ua)!=null?f:c}function Gj(a,b,c,d){try{var e=pj(b,c);return yj(a.l,e)}catch(f){Ij(d,f,"apps_telemetry.processed")}return null} -Ej.prototype.aa=function(){var a=new Map;try{for(var b=v(this.g),c=b.next();!c.done;c=b.next())c.value.aa().forEach(function(d,e){a.set(e,d)})}catch(d){Ij(a,d,"apps_telemetry.annotated")}return a};function Hj(a,b){b.forEach(function(c,d){a.set(d,c)})}function Ij(a,b,c){a.set(c,"false");a.set("apps_telemetry.handling_error",mj(b))};function Jj(a){var b=a=a===void 0?{}:a;a=b.xa===void 0?[]:b.xa;var c=b.lb===void 0?[]:b.lb,d=b.ib===void 0?[]:b.ib;b=b.cb===void 0?[]:b.cb;try{var e=Id=Id||new Jd;var f=Ld.key in e.g?Ld.ctor(e.g[Ld.key]):Ld.defaultValue,g=void 0===Db?2:4;e=void 0;var h=f.A,k=h[C]|0,l=Bb(f,k)?1:g;e=!!e||l===3;l===2&&Ic(f)&&(h=f.A,k=h[C]|0);var m=Sc(h,1),t=m===wb?7:m[C]|0,r=Tc(t,k);if(f=4&r?!1:!0){4&r&&(m=Array.prototype.slice.call(m),t=0,r=Rc(r,k),k=Oc(h,k,1,m));for(var z=g=0;g0&&h.push(uj(c,[],6,0));d.length>0&&h.push(new qj(d,[],6,0));b.length>0&&h.push(uj(b,[],6,5));return new Ej(h,P,[new Pi].concat(pa(a)))};try{var Kj,Lj,Mj=(Lj=(Kj=window)==null?void 0:Kj.top)!=null?Lj:w;Mj.U3bHHf!=null||(Mj.U3bHHf=0);Mj.U3bHHf++}catch(a){w.U3bHHf!=null||(w.U3bHHf=0),w.U3bHHf++};"#".replace(/([-()\[\]{}+?*.$\^|,:#2){var h=Array.prototype.slice.call(arguments,2);g=function(){e.apply(this,h)}}return d(g,f)};c[b][Uj(a,!1)]=d} -Sj.prototype.L=function(){var a=w.window||w.globalThis;var b=a.setTimeout;b=b[Uj(this,!1)]||b;a.setTimeout=b;b=a.setInterval;b=b[Uj(this,!1)]||b;a.setInterval=b;Sj.T.L.call(this)};function Xj(a){A.call(this,"Error in protected function: "+(a&&a.message?String(a.message):String(a)),a);(a=a&&a.stack)&&typeof a==="string"&&(this.stack=a)}y(Xj,A);function ak(){};var bk;function ck(){}y(ck,ak);ck.prototype.j=function(){return new XMLHttpRequest};bk=new ck;function dk(a){Z.call(this);this.headers=new Map;this.S=a||null;this.l=!1;this.g=null;this.M="";this.B=0;this.o=this.K=this.F=this.H=!1;this.N=0;this.v=null;this.O="";this.R=!1}y(dk,Z);var ek=/^https?$/i,fk=["POST","PUT"],gk=[];p=dk.prototype;p.Qa=function(){this.dispose();Ua(gk,this)}; -p.send=function(a,b,c,d){if(this.g)throw Error("[goog.net.XhrIo] Object is active with another request="+this.M+"; newUri="+a);b=b?b.toUpperCase():"GET";this.M=a;this.B=0;this.H=!1;this.l=!0;this.g=this.S?this.S.j():bk.j();this.g.onreadystatechange=Df(x(this.Ba,this));try{this.K=!0,this.g.open(b,String(a),!0),this.K=!1}catch(g){hk(this);return}a=c||"";c=new Map(this.headers);if(d)if(Object.getPrototypeOf(d)===Object.prototype)for(var e in d)c.set(e,d[e]);else if(typeof d.keys==="function"&&typeof d.get=== -"function"){e=v(d.keys());for(var f=e.next();!f.done;f=e.next())f=f.value,c.set(f,d.get(f))}else throw Error("Unknown input type for opt_headers: "+String(d));d=Array.from(c.keys()).find(function(g){return"content-type"==g.toLowerCase()});e=w.FormData&&a instanceof w.FormData;!(Sa(fk,b)>=0)||d||e||c.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8");b=v(c);for(d=b.next();!d.done;d=b.next())c=v(d.value),d=c.next().value,c=c.next().value,this.g.setRequestHeader(d,c);this.O&&(this.g.responseType= -this.O);"withCredentials"in this.g&&this.g.withCredentials!==this.R&&(this.g.withCredentials=this.R);try{this.v&&(clearTimeout(this.v),this.v=null),this.N>0&&(this.v=setTimeout(this.mb.bind(this),this.N)),this.F=!0,this.g.send(a),this.F=!1}catch(g){hk(this)}};p.mb=function(){typeof wa!="undefined"&&this.g&&(this.B=8,this.dispatchEvent("timeout"),this.abort(8))};function hk(a){a.l=!1;a.g&&(a.o=!0,a.g.abort(),a.o=!1);a.B=5;ik(a);jk(a)} -function ik(a){a.H||(a.H=!0,a.dispatchEvent("complete"),a.dispatchEvent("error"))}p.abort=function(a){this.g&&this.l&&(this.l=!1,this.o=!0,this.g.abort(),this.o=!1,this.B=a||7,this.dispatchEvent("complete"),this.dispatchEvent("abort"),jk(this))};p.L=function(){this.g&&(this.l&&(this.l=!1,this.o=!0,this.g.abort(),this.o=!1),jk(this,!0));dk.T.L.call(this)};p.Ba=function(){this.ka()||(this.K||this.F||this.o?kk(this):this.ta())};p.ta=function(){kk(this)}; -function kk(a){if(a.l&&typeof wa!="undefined")if(a.F&&(a.g?a.g.readyState:0)==4)setTimeout(a.Ba.bind(a),0);else if(a.dispatchEvent("readystatechange"),(a.g?a.g.readyState:0)==4){a.l=!1;try{Ei(a)?(a.dispatchEvent("complete"),a.dispatchEvent("success")):(a.B=6,ik(a))}finally{jk(a)}}}function jk(a,b){if(a.g){a.v&&(clearTimeout(a.v),a.v=null);var c=a.g;a.g=null;b||a.dispatchEvent("ready");try{c.onreadystatechange=null}catch(d){}}}p.isActive=function(){return!!this.g}; -function Ei(a){var b=Di(a);a:switch(b){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var c=!0;break a;default:c=!1}if(!c){if(b=b===0)a=String(a.M).match(sf)[1]||null,!a&&w.self&&w.self.location&&(a=w.self.location.protocol.slice(0,-1)),b=!ek.test(a?a.toLowerCase():"");c=b}return c}function Di(a){try{return(a.g?a.g.readyState:0)>2?a.g.status:-1}catch(b){return-1}}Jf(function(a){dk.prototype.ta=a(dk.prototype.ta)});function lk(a,b,c){Z.call(this);this.v=b||null;this.o={};this.B=mk;this.H=a;if(!c){this.g=null;this.g=new Sj(x(this.l,this));Zj(this.g,"setTimeout");Zj(this.g,"setInterval");a=this.g;b=w.window||w.globalThis;c=["requestAnimationFrame","mozRequestAnimationFrame","webkitAnimationFrame","msRequestAnimationFrame"];for(var d=0;d0;)f=" "+f;d.call(c,"[",f,"s] ");c.push("[",b.j(),"] ");c.push(b.getMessage());a.l&&(b=b.g(),b!==void 0&&c.push("\n",b instanceof -Error?b.message:String(b)));a.g&&c.push("\n");return c.join("")};function wk(a){a=a===void 0?new xk:a;Z.call(this);var b=this;this.O={};this.g=null;this.l={};this.M=new wi(this);this.Ra=a.v;this.R=a.K;this.Ha=a.F;this.Oa=a.D;this.Ia=a.M;var c=a.j;this.Fa=Jj({xa:a.H});this.Na=a.P;this.S=new Mh;var d=new dk;yk(this,c);this.F=new Fi(d,c,void 0,void 0,void 0);Cf(this,this.F);this.o=a.g?a.g:Ug(c,"docs-sup")+Ug(c,"docs-jepp")+"/jserror";if(d=Ug(c,"jobset"))this.o=yf(this.o,"jobset",d);if(d=Ug(c,"docs-ci"))this.o=yf(this.o,"id",d);d=Ug(c,"docs-pid");Qg(c.get("docs-eaotx"))&& -d&&(this.o=yf(this.o,"ouid",d));this.da=Tg(c,"docs-srmoe")||0;this.Ka=Qg(c.get("docs-oesf"));this.ea=Tg(c,"docs-srmour")||0;this.Ma=Qg(c.get("docs-oursf"));d=a.o||this.ea>0&&Math.random()0&&Math.random()0&&Math.random()< -e;c.get("docs-xduesf");e&&Xe();d&&(d=new Sj(function(g){var h={};h=(h.isUnhandledRejection="true",h);b.Ma?Bk(b,g,h):b.info(g,h)}),Yj(d),Cf(this,d));this.K=null;typeof document!=="undefined"&&document.body&&(this.K=Qj(function(g){var h={};h=(h.isWizError="true",h);g=v(g.data.errors);for(var k=g.next();!k.done;k=g.next())k=k.value.error,b.Ja?Bk(b,k,h):b.info(k,h)}));this.N=a.l;this.B=!1;this.H=!0;this.v=!1;this.ca=Ug(c,"docs-jern");this.Ga=a.B;this.Ea=a.J.concat(Object.values(Ue))}u(wk,Z); -function zk(a){var b=b===void 0?!1:b;if(Ck){if(Dk!=null)throw Error('ErrorReporter already installed. at "'+Dk.stack+'"');throw Error("ErrorReporter already installed.");}Ck=!0;Dk=Error();a.g=ok(a.o,function(e,f){return Ek(a,e,f)});var c={};a.Ha&&(c["X-No-Abort"]="1");a.g.F=c;pk(a.g,function(e,f,g,h){a.H&&a.F.send(e,f,g,h)});if(a.da>0&&Math.random()0){var d=new uk,e="";pf(function(g){e+=vk(d,g)});b.clientLog=e}c=b.severity||"fatal";this.Na||(c=Fj(this.Fa,a,c,b));this.ca&&(b.reportName=this.ca+"_"+c);b.isArrayPrototypeIntact=Ii().toString();if(!("WorkerGlobalScope"in w&&self instanceof w.WorkerGlobalScope)){try{var f=!!document.getElementById("docs-editor")}catch(g){f=!1}b.isEditorElementAttached=f.toString()}b.documentCharacterSet= -document.characterSet;b.origin=String(w.origin);f=a.stack||"";if(f.trim().length==0||f=="Not available")b["stacklessError-reportingStack"]=ef(wk.prototype.X),[a.message].concat(pa(Object.keys(b)),pa(Object.values(b))).some(function(g){return g&&g.includes("");this.B&&!this.N?(this.H=this.v,c=="fatal"?c="postmortem":c=="incident"&&(c="warningafterdeath")):c=="fatal"&&(this.B=!0);this.v=!1;b.severity=c}; -wk.prototype.L=function(){Ck=!1;if(this.K)for(var a=this.K,b=v(a.et),c=b.next();!c.done;c=b.next()){c=c.value;var d=Nj(a.el,c);if(d&&(Ua(d,a.Pa),!d.length)){d=a.el;var e=Ka(d.getAttribute("jsaction")||"");c+=":.CLIENT";e=e.replace(c+";","");e=e.replace(c,"");Rj(d,e)}}Bf(this.M,this.g,this.F);Z.prototype.L.call(this)};var Ck=!1,Dk=null;function xk(){this.K=this.j=void 0;this.D=this.M=this.v=!1;this.g=void 0;this.F=this.l=!1;this.B=!0;this.J=[];this.P=this.o=!1;this.H=[]} -function Fk(a,b){a instanceof Ke&&(a=a.g);gb(a,"severity",b)};function Kk(a){this.o=a.pb||null;this.l=a.oc||!1;this.g=void 0}y(Kk,ak);Kk.prototype.j=function(){var a=new Lk(this.o,this.l);this.g&&(a.F=this.g);return a};function Lk(a,b){Z.call(this);this.X=a;this.K=b;this.F=void 0;this.status=this.readyState=0;this.responseType=this.o=this.l=this.statusText="";this.onreadystatechange=null;this.N=new Headers;this.v=null;this.R="GET";this.S="";this.g=!1;this.O=this.B=this.H=null;this.M=new AbortController}y(Lk,Z);p=Lk.prototype; -p.open=function(a,b){if(this.readyState!=0)throw this.abort(),Error("Error reopening a connection");this.R=a;this.S=b;this.readyState=1;Mk(this)};p.send=function(a){if(this.readyState!=1)throw this.abort(),Error("need to call open() first. ");if(this.M.signal.aborted)throw this.abort(),Error("Request was aborted.");this.g=!0;var b={headers:this.N,method:this.R,credentials:this.F,cache:void 0,signal:this.M.signal};a&&(b.body=a);(this.X||w).fetch(new Request(this.S,b)).then(this.Ya.bind(this),this.ia.bind(this))}; -p.abort=function(){this.l=this.o="";this.N=new Headers;this.status=0;this.M.abort("Request was aborted.");this.B&&this.B.cancel("Request was aborted.").catch(n());this.readyState>=1&&this.g&&this.readyState!=4&&(this.g=!1,Nk(this));this.readyState=0}; -p.Ya=function(a){if(this.g&&(this.H=a,this.v||(this.status=this.H.status,this.statusText=this.H.statusText,this.v=a.headers,this.readyState=2,Mk(this)),this.g&&(this.readyState=3,Mk(this),this.g)))if(this.responseType==="arraybuffer")a.arrayBuffer().then(this.Wa.bind(this),this.ia.bind(this));else if(typeof w.ReadableStream!=="undefined"&&"body"in a){this.B=a.body.getReader();if(this.K){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.l= -[]}else this.l=this.o="",this.O=new TextDecoder;Ok(this)}else a.text().then(this.Xa.bind(this),this.ia.bind(this))};function Ok(a){a.B.read().then(a.Va.bind(a)).catch(a.ia.bind(a))}p.Va=function(a){if(this.g){if(this.K&&a.value)this.l.push(a.value);else if(!this.K){var b=a.value?a.value:new Uint8Array(0);if(b=this.O.decode(b,{stream:!a.done}))this.l=this.o+=b}a.done?Nk(this):Mk(this);this.readyState==3&&Ok(this)}};p.Xa=function(a){this.g&&(this.l=this.o=a,Nk(this))}; -p.Wa=function(a){this.g&&(this.l=a,Nk(this))};p.ia=function(){this.g&&Nk(this)};function Nk(a){a.readyState=4;a.H=null;a.B=null;a.O=null;Mk(a)}p.setRequestHeader=function(a,b){this.N.append(a,b)};p.getResponseHeader=function(a){return this.v?this.v.get(a.toLowerCase())||"":""};p.getAllResponseHeaders=function(){if(!this.v)return"";for(var a=[],b=this.v.entries(),c=b.next();!c.done;)c=c.value,a.push(c[0]+": "+c[1]),c=b.next();return a.join("\r\n")}; -function Mk(a){a.onreadystatechange&&a.onreadystatechange.call(a)}Object.defineProperty(Lk.prototype,"withCredentials",{get:function(){return this.F==="include"},set:function(a){this.F=a?"include":"same-origin"}});function Pk(a){this.g=null;this.j=a<1;this.l=a<.01}function Qk(a,b,c){c=c===void 0?{}:c;a.l&&(c.sampling_samplePercentage=(.01).toString(),a.g.info(b,c))}function Rk(a,b,c){c=c===void 0?{}:c;a.j&&(c.sampling_samplePercentage=(1).toString(),Hk(a.g,b,c))};function Sk(a){this.A=G(a)}u(Sk,J);Sk.prototype.getMessage=function(){return dd(this,1)};function Tk(a){this.A=G(a)}u(Tk,J);function Uk(a){this.A=G(a)}u(Uk,J);function Vk(a){this.A=G(a)}u(Vk,J);function Wk(a,b){return hd(a,b)}Vk.prototype.Aa=function(){return I(this,Tk,3)};Vk.prototype.pa=function(){return I(this,Sk,5)};function Xk(a){this.A=G(a)}u(Xk,J);function Yk(a){var b=new Xk;return hd(b,a)}Xk.prototype.pa=function(){return I(this,Sk,3)};Xk.prototype.Aa=function(){return I(this,Tk,4)};function Zk(a){var b=fg();chrome.runtime.sendMessage(zc(a),void 0,function(c){return $k(b,function(d){return new Xk(d)},c)});return b.promise.catch(function(c){c=df(c);gb(c,"offscreenDocumentRequestType",ed(a,1).toString());throw c;})} -function $k(a,b,c){var d=chrome.runtime;c!==void 0?(d=b(c),d.pa()?(b=a.reject,c=Error,d=d.pa(),d=fd(d,1),b.call(a,c("Error from Offscreen page:"+d))):a.resolve(d)):a.reject(Error("No response from Offscreen page:"+(d.lastError?d.lastError.message:"without lastError")))};function al(){return bl(chrome.storage.local,["optedInUserOuid"]).then(function(a){return a.optedInUserOuid||null})}function cl(a){return dl({offlineOptedIn:!0}).then(function(){if(a){var b={};return dl((b.optedInUserOuid=a,b))}})}function el(){return dl({offlineOptedIn:!1}).then(function(){return fl()})} -function gl(){return bl(chrome.storage.local,["offlineOptedIn"]).then(function(a){a=a.offlineOptedIn;switch(a){case void 0:return"unknown";case !0:return"opted_in";case !1:return"opted_out";default:throw Error("Cannot handle opt in value "+a);}})}function dg(){return bl(chrome.storage.managed,["allowedDocsOfflineDomains"]).then(function(a){return a&&a.allowedDocsOfflineDomains?a.allowedDocsOfflineDomains:[]})} -function eg(){return bl(chrome.storage.managed,["autoEnabledDocsOfflineDomains"]).then(function(a){return a&&a.autoEnabledDocsOfflineDomains?a.autoEnabledDocsOfflineDomains:[]})}function bl(a,b){return new X(function(c,d){a.get(b,function(e){chrome.runtime.lastError?d(Error(chrome.runtime.lastError)):c(e)})})}function dl(a){return new X(function(b,c){chrome.storage.local.set(a,function(){chrome.runtime.lastError?c(Error(chrome.runtime.lastError)):b()})})} -function fl(){return new X(function(a,b){chrome.storage.local.remove("optedInUserOuid",function(){chrome.runtime.lastError?b(Error(chrome.runtime.lastError)):a()})})}function hl(){return bl(chrome.storage.local,["lastSuccessfulFrameConnectTime"]).then(function(a){return a.lastSuccessfulFrameConnectTime||null})};function il(a){this.A=G(a)}u(il,J);function jl(a){this.A=G(a)}u(jl,J);function kl(a){this.A=G(a)}u(kl,J);function ll(a){this.A=G(a)}u(ll,J);function ml(a){this.A=G(a)}u(ml,J);function nl(a){this.A=G(a)}u(nl,J);function ol(a){var b=new nl;return hd(b,a)}function pl(a,b){return $c(a,ll,5,b)};function ql(a,b,c){W.call(this);this.v=null;this.H=a;this.B=b;this.o=c;this.j=fg();this.l=!1;a=new sh;vh(a,"offscreendocument.html");Gh(a,"randomPercentageForSampling",this.o);Gh(a,"sessionId",this.B);this.F={url:a.toString(),reasons:["IFRAME_SCRIPTING"],justification:"Use iframe to access user data under docs.google.com domain"};this.g=new Pk(this.o)}u(ql,W);function rl(a,b){a.v=b} -function sl(a){return tl().then(function(b){return b?Zk(ol(5)).then(function(){return chrome.offscreen.closeDocument()}):Promise.resolve()}).then(function(){ul(a)})}function vl(a,b){return wl(xl(a,yl(a,6,b)))}function zl(a,b){b=yl(a,1,b);return wl(xl(a,b))}function Al(a,b){return tl().then(function(c){b[Bl(0)]=c.toString();return c?Promise.resolve():Cl(a)})} -function Cl(a){return chrome.offscreen.createDocument(a.F).catch(function(b){if(b instanceof Error&&b.message.includes("Only a single offscreen document may be created"))Qk(a.g,b);else return Promise.reject(b)})}function Dl(a,b){return chrome.offscreen.closeDocument().catch(function(c){c=c instanceof Error?c.message:c.toString();Qk(a.g,Error(c),b);b.errorWhenForceCloseOffscreenDoc=c}).then(function(){return Cl(a)})} -function yl(a,b,c){b=ol(b);var d=new il;c=gd(d,1,c);c=gd(c,2,a.v.toString());a=gd(c,3,a.H);a=gd(a,4,"opted_in");return $c(b,il,2,a)} -function El(a,b){var c={sendingFrameRequestType:ed(b,1)},d=pl(ol(4),b);return wl(Fl(a,d,c,0)).catch(function(e){if(e instanceof Error){c.offlineFrameConnected_afterFirstError=a.l;if(Gl(e.message))return Qk(a.g,e,c),new Promise(function(f){return setTimeout(function(){return f(Fl(a,d,c,1))},2E3)});if("Requests cancelled because user has been opted out"==e.message)return Promise.resolve(new Tk)}return Promise.reject(e instanceof Error?e:Error(e))})} -function Fl(a,b,c,d){return a.j.promise.then(function(){return tl()}).then(function(e){c[Bl(d)]=e.toString();return e?Zf():Hl(a)}).then(function(){return a.j.promise}).then(function(){return Zk(b)}).then(function(e){return e.Aa()}).V(function(e){return Il(e,c)})}function Hl(a){ul(a);return gl().then(function(b){return b=="opted_in"?al().then(function(c){return zl(a,c)}):$f()})} -function xl(a,b){ed(b,1)==6||ed(b,1);var c={sendingOffscreenDocumentRequestType:ed(b,1).toString()};return Zf(Al(a,c)).then(function(){return ri()}).then(function(){return Zk(b)}).V(function(d){return d instanceof Error&&Gl(d.message)?(Qk(a.g,d,c),Zf(tl()).then(function(e){c[Bl(1)]=e.toString()}).then(function(){return Dl(a,c)}).then(function(){return ri()}).then(function(){return Zk(b)})):Promise.reject(d instanceof Error?d:Error(d))}).V(function(d){return Il(d,c)})} -function Gl(a){return a.includes("Could not establish connection. Receiving end does not exist.")||a.includes("The message port closed before a response was received.")||a.includes("A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received")}function tl(){return self.clients.matchAll().then(function(a){return a.some(function(b){return b.url.includes(chrome.runtime.getURL("offscreendocument.html"))})})} -ql.prototype.L=function(){sl(this);W.prototype.L.call(this)};function wl(a){return Promise.resolve(a)}function ul(a){a.j=fg();a.l=!1}function Bl(a){switch(a){case 0:return"hasDocument_beforeCreatingOffscreenDoc_0";case 1:return"hasDocument_beforeCreatingOffscreenDoc_1";default:throw Error("Cannot get error context key with retryAttempt "+a);}} -function Il(a,b){a=df(a);b=v(Object.entries(b));for(var c=b.next();!c.done;c=b.next()){var d=v(c.value);c=d.next().value;d=d.next().value;gb(a,c,d)}throw a;};function Jl(a){this.A=G(a)}u(Jl,J);function Kl(a){this.A=G(a)}u(Kl,J);function Ll(a){this.A=G(a)}u(Ll,J);function Ml(){x(this.l,this);this.g=new uk;this.g.j=!1;this.g.l=!1;this.j=this.g.g=!1;this.o={}}function Nl(a){1!=a.j&&(a.j=!0)}Ml.prototype.l=function(a){function b(f){if(f){if(f.value>=kf.value)return"error";if(f.value>=lf.value)return"warn";if(f.value>=mf.value)return"log"}return"debug"}if(!this.o[a.j()]){var c=vk(this.g,a),d=Ol;if(d){var e=b(a.o());Pl(d,e,c,a.g())}}};var Ol=w.console;function Pl(a,b,c,d){if(a[b])a[b](c,d===void 0?"":d);else a.log(c,d===void 0?"":d)};var Ql=new Kk({pb:self});Ql.g="same-origin";bk=Ql; -function Rl(){W.call(this);var a=this;this.F=Ne();this.g=this.v=null;this.M=!1;this.P=new Ml;Nl(this.P);this.K=fg();chrome.alarms.onAlarm.addListener(function(b){return a.K.promise.then(function(){return Jk(a.g,Ik(a.g,a.eb,a)(b))})});chrome.runtime.onMessageExternal.addListener(function(b,c,d){return Sl(a,b,d)});chrome.runtime.onMessage.addListener(this.fb.bind(this));this.B=new wi(this);Cf(this,this.B);this.B.listen(w,"message",this.gb);this.o=Math.random()*100;this.H=this.o<1;this.l=new Pk(this.o); -this.j=new ql(Tl(),this.F,this.o);chrome.runtime.onConnectExternal.addListener(n());qi(this.kb,252E5,this)}u(Rl,W);p=Rl.prototype;p.load=function(){var a=this;this.v="docs.google.com";return dl({docsDomain:this.v}).then(function(){a.g=Ul(a);a.K.resolve();Cf(a,a.g);a.l.g=a.g;a.j.g.g=a.g;rl(a.j,Vl(a));Cf(a,a.j);var b=Ik(a.g,a.ab,a),c=Jk(a.g,Zf().then(function(){return b()}));return Zf(c)}).V(function(b){df(b)})}; -function Wl(a,b,c){return Gh(Gh(vh(Vl(a),"/offline/extension/report"),"v",c),"optin",b).toString()}p.kb=function(){chrome.alarms.create("open",{delayInMinutes:1});Qk(this.l,Error("Called unsafeClose_"))};function Xl(a,b){b=b===void 0?!1:b;return new X(function(c){chrome.alarms.get("heartbeat",function(d){d||chrome.alarms.create("heartbeat",{periodInMinutes:5});d&&!b||Yl(a,"heartbeat");c()})})}function Zl(){return new X(function(a){chrome.alarms.clear("heartbeat",function(){a()})})} -p.ab=function(){var a=this;return hl().then(function(b){a.g.l.lastSuccessfulFrameConnectTime=(b==null?void 0:b.toString())||"null"}).then(function(){return gl()}).then(function(b){var c=Tl();a.g.l.extensionVersion=c;a.g.l.optInStatus=String(b);$l(a,String(b),c);switch(b){case "unknown":break;case "opted_in":return al().then(function(d){return zl(a.j,d)});case "opted_out":break;default:throw Error("Could not handle opt in status "+b);}})}; -function $l(a,b,c){a.H&&(b=Wl(a,b,c),w.fetch(new Request(b,{method:"post",mode:"cors"})).then(n()).catch(function(d){Hk(a.g,df(d))}))}p.gb=function(a){var b=a.g;b&&b.data&&b.ports&&b.ports.length?(a=new Ll(b.data),am(this,a,b.ports.length>1?b.ports[1]:void 0).then(function(c){b.ports[0].postMessage(zc(c))})):Rk(this.l,Error("Dropped invalid event."),{event:String(a)})}; -function Sl(a,b,c){var d=new Ll(b);am(a,d).then(function(e){c(zc(e))}).V(function(e){if(e instanceof Error&&e.message=="Attempting to use a disconnected port object")Rk(a.l,Error("Failed to reply to request because listen port was disconnected."),{requestType:hc(H(d,1,void 0,Lc))});else throw e;});return!0} -p.fb=function(a,b,c){var d=this;a=new nl(a);switch(hc(H(a,1,void 0,Lc))){case 3:var e=I(a,jl,4);a=oc(H(e,1))!=null?dd(e,1):null;var f=fd(e,2);cl(a).then(function(){return dl({lastSuccessfulFrameConnectTime:parseInt(f,10)})}).then(function(){var h=d.j;h.l=!0;h.j.resolve()}).then(function(){var h=Yk(3);c(zc(h))});break;case 7:var g=Yk(7);(a=(e=I(a,ml,6))==null?void 0:dd(e,1))?bm(this,a).then(function(){return c(zc(g))}):cm(this).then(function(){return c(zc(g))});break;default:throw Error("Unsupported OffscreenDocumentRequestType."); -}return!0};function am(a,b,c){return Zf().then(a.hb.bind(a,b,c)).V(function(d){d=d instanceof Error?d:Error(d);var e=new Vk,f=new Sk;$c(e,Sk,5,f);gd(f,1,d.message);return e})} -p.hb=function(a){var b=this,c=Wk(new Vk,hc(H(a,1)));switch(hc(H(a,1,void 0,Lc))){case 1:return(a=(a=I(a,jl,7))?fd(a,1):null)||Qk(this.l,Error("Scheduler frame connect request sent without an ouid.")),cl(a).then(function(){return dl({lastSuccessfulFrameConnectTime:Date.now()})}).then(function(){var f=b.j;f.l=!0;f.j.resolve()}).then(function(){return c});case 2:var d=(a=I(a,Jl,8))?fd(a,1):null,e=a?!!ad(a,2):!1;return cl(d).then(function(){return d?d:al()}).then(function(f){return vl(b.j,f).then(function(){return Xl(b, -e)})}).then(function(){return c});case 3:return(a=I(a,ml,3))&&dd(a,1)?(a=dd(a,1),bm(this,a).then(function(){return c})):cm(this).then(function(){return c});case 5:return dm(I(a,Kl,5)).then(function(f){$c(c,Uk,4,f);return c});case 4:return a=I(a,ll,4),Zf(El(this.j,a)).then(function(f){$c(c,Tk,3,f);return c})}throw Error("Dropped unknown message "+a);}; -function dm(a){var b=fd(a,1);return cg().then(function(c){var d=c[0],e=c[1];c=new Uk;e=Sa(e,b)>=0;d=Sa(d,b)>=0||e;d=d==null?d:dc(d);Nc(c,1,d);Nc(c,2,e==null?e:dc(e));return c})}function bm(a,b){return a.M?Zf(sl(a.j)):(Qk(a.l,Error("Extension frame connected with the wrong OUID.")),a.M=!0,Zf(zl(a.j,b)))}function cm(a){return el().then(function(){return Zl()}).then(function(){return sl(a.j)})}p.eb=function(a){return Yl(this,a.name)}; -function Yl(a,b){var c=new ll;c=hd(c,0);var d=new kl;b=gd(d,1,b);$c(c,kl,2,b);return Zf(El(a.j,c))}function Ul(a){var b=vh(Vl(a),"/offline/jserror").toString(),c=a.H;a=String(a.F);var d=!0;d=d===void 0?!1:d;var e=e===void 0?Ng():e;var f=new xk;f.v=!1;f.D=!0;f.g=b;f.l=d;f.j=e;f.o=!1;b=new wk(f);b.l.sessionTypeName="offline-event-page";b.l.reportsNonFatalErrors=String(c);b.l.sid=a;return b}function Vl(a){return th(new sh("//"+a.v),"https")} -function Tl(){var a=chrome.runtime.getManifest();return a.version?a.version:"unknown"};self.window=self;(new Rl).load(); +'use strict';function aa(){return function(a){return a}}function n(){return function(){}}function ba(a){return function(){return this[a]}}function ca(a){return function(){return a}}var p,da=typeof Object.create=="function"?Object.create:function(a){function b(){}b.prototype=a;return new b},ea=typeof Object.defineProperties=="function"?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a}; +function fa(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b>>0)+"_",e=0;return b}); +q("Symbol.iterator",function(a){if(a)return a;a=Symbol("Symbol.iterator");ea(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return ra(oa(this))}});return a});function ra(a){a={next:a};a[Symbol.iterator]=function(){return this};return a} +q("Promise",function(a){function b(g){this.g=0;this.l=void 0;this.j=[];this.J=!1;var h=this.o();try{g(h.resolve,h.reject)}catch(k){h.reject(k)}}function c(){this.g=null}function d(g){return g instanceof b?g:new b(function(h){h(g)})}if(a)return a;c.prototype.j=function(g){if(this.g==null){this.g=[];var h=this;this.l(function(){h.D()})}this.g.push(g)};var e=ha.setTimeout;c.prototype.l=function(g){e(g,0)};c.prototype.D=function(){for(;this.g&&this.g.length;){var g=this.g;this.g=[];for(var h=0;h=f}}); +function va(a,b){a instanceof String&&(a+="");var c=0,d=!1,e={next:function(){if(!d&&c>>16&65535)*e+d*(c>>>16&65535)<<16>>>0)|0}}); +q("String.prototype.repeat",function(a){return a?a:function(b){var c=ua(this,null,"repeat");if(b<0||b>1342177279)throw new RangeError("Invalid count value");b|=0;for(var d="";b;)if(b&1&&(d+=c),b>>>=1)c+=c;return d}}); +q("String.prototype.matchAll",function(a){return a?a:function(b){if(b instanceof RegExp&&!b.global)throw new TypeError("RegExp passed into String.prototype.matchAll() must have global tag.");var c=new RegExp(b,b instanceof RegExp?void 0:"g"),d=this,e=!1,f={next:function(){if(e)return{value:void 0,done:!0};var g=c.exec(d);if(!g)return e=!0,{value:void 0,done:!0};g[0]===""&&(c.lastIndex+=1);return{value:g,done:!1}}};f[Symbol.iterator]=function(){return f};return f}});/* + + Copyright The Closure Library Authors. + SPDX-License-Identifier: Apache-2.0 +*/ +var wa=wa||{},w=this||self;function xa(a,b){var c=ya("CLOSURE_FLAGS");a=c&&c[a];return a!=null?a:b}function ya(a){a=a.split(".");for(var b=w,c=0;c>>0),Da=0; +function Ea(a,b,c){return a.call.apply(a.bind,arguments)}function Fa(a,b,c){if(!a)throw Error();if(arguments.length>2){var d=Array.prototype.slice.call(arguments,2);return function(){var e=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(e,d);return a.apply(b,e)}}return function(){return a.apply(b,arguments)}}function x(a,b,c){x=Function.prototype.bind&&Function.prototype.bind.toString().indexOf("native code")!=-1?Ea:Fa;return x.apply(null,arguments)} +function Ga(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function Ha(a){(0,eval)(a)}function Ia(a){return a}function y(a,b){function c(){}c.prototype=b.prototype;a.T=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.kc=function(d,e,f){for(var g=Array(arguments.length-2),h=2;h0:!1};function Sa(a,b){return Array.prototype.indexOf.call(a,b,void 0)}function Ta(a,b){return Array.prototype.some.call(a,b,void 0)}function Ua(a,b){b=Sa(a,b);var c;(c=b>=0)&&Array.prototype.splice.call(a,b,1);return c}function Va(a,b){for(var c=1;c=b||(d[a]=c+1,a=Error(),gb(a,"severity","incident"),Ja(a))}};function kb(){return typeof BigInt==="function"};var lb=typeof Symbol==="function"&&typeof Symbol()==="symbol";function mb(a,b,c){return typeof Symbol==="function"&&typeof Symbol()==="symbol"?(c===void 0?0:c)&&Symbol.for&&a?Symbol.for(a):a!=null?Symbol(a):Symbol():b}var nb=mb("jas",void 0,!0),ob=mb(void 0,"0di"),pb=mb(void 0,"1oa"),qb=mb(void 0,Symbol()),rb=mb(void 0,"0ubs"),sb=mb(void 0,"0actk"),tb=mb("m_m","nc",!0);Math.max.apply(Math,pa(Object.values({Mb:1,Kb:2,Hb:4,Vb:8,ec:16,Rb:32,tb:64,Fb:128,Db:256,bc:512,Eb:1024,Gb:2048,Sb:4096,Nb:8192})));var ub={bb:{value:0,configurable:!0,writable:!0,enumerable:!1}},vb=Object.defineProperties,C=lb?nb:"bb",wb,xb=[];D(xb,7);wb=Object.freeze(xb);function yb(a,b){lb||C in a||vb(a,ub);a[C]|=b}function D(a,b){lb||C in a||vb(a,ub);a[C]=b}function zb(a){yb(a,34);return a};var Ab={};function Bb(a,b){return b===void 0?a.g!==Cb&&!!(2&(a.A[C]|0)):!!(2&b)&&a.g!==Cb}var Cb={},Db=Object.freeze({});function Eb(a){a.mc=!0;return a};var Fb=Eb(function(a){return typeof a==="number"}),Gb=Eb(function(a){return typeof a==="string"}),Hb=Eb(function(a){return typeof a==="boolean"}),Ib=Eb(function(a){return typeof a==="bigint"});var Jb=typeof w.BigInt==="function"&&typeof w.BigInt(0)==="bigint";function Kb(a){var b=a;if(Gb(b)){if(!/^\s*(?:-?[1-9]\d*|0)?\s*$/.test(b))throw Error(String(b));}else if(Fb(b)&&!Number.isSafeInteger(b))throw Error(String(b));return Jb?BigInt(a):a=Hb(a)?a?"1":"0":Gb(a)?a.trim()||"0":String(a)} +var Lb=Eb(function(a){return Jb?Ib(a):Gb(a)&&/^(?:-?[1-9]\d*|0)$/.test(a)}),Rb=Eb(function(a){return Jb?a>=Mb&&a<=Nb:a[0]==="-"?Ob(a,Pb):Ob(a,Qb)}),Pb=Number.MIN_SAFE_INTEGER.toString(),Mb=Jb?BigInt(Number.MIN_SAFE_INTEGER):void 0,Qb=Number.MAX_SAFE_INTEGER.toString(),Nb=Jb?BigInt(Number.MAX_SAFE_INTEGER):void 0;function Ob(a,b){if(a.length>b.length)return!1;if(a.lengthe)return!1;if(d>>0;E=b;F=(a-b)/4294967296>>>0}function Tb(a){if(a<0){Sb(0-a);var b=v(Ub(E,F));a=b.next().value;b=b.next().value;E=a>>>0;F=b>>>0}else Sb(a)}function Vb(a,b){b>>>=0;a>>>=0;if(b<=2097151)var c=""+(4294967296*b+a);else kb()?c=""+(BigInt(b)<>>24|b<<8)&16777215,b=b>>16&65535,a=(a&16777215)+c*6777216+b*6710656,c+=b*8147497,b*=2,a>=1E7&&(c+=a/1E7>>>0,a%=1E7),c>=1E7&&(b+=c/1E7>>>0,c%=1E7),c=b+Wb(c)+Wb(a));return c} +function Wb(a){a=String(a);return"0000000".slice(a.length)+a}function Xb(){var a=E,b=F;b&2147483648?kb()?a=""+(BigInt(b|0)<>>0)):(b=v(Ub(a,b)),a=b.next().value,b=b.next().value,a="-"+Vb(a,b)):a=Vb(a,b);return a}function Ub(a,b){b=~b;a?a=~a+1:b+=1;return[a,b]};var Yb=typeof BigInt==="function"?BigInt.asIntN:void 0,Zb=Number.isSafeInteger,$b=Number.isFinite,ac=Math.trunc;function bc(a){if(a==null||typeof a==="number")return a;if(a==="NaN"||a==="Infinity"||a==="-Infinity")return Number(a)}function cc(a){return a.displayName||a.name||"unknown type name"}function dc(a){if(typeof a!=="boolean")throw Error("Expected boolean but got "+za(a)+": "+a);return a}var ec=/^-?([1-9][0-9]*|0)(\.[0-9]+)?$/; +function fc(a){switch(typeof a){case "bigint":return!0;case "number":return $b(a);case "string":return ec.test(a);default:return!1}}function hc(a){return a==null?a:$b(a)?a|0:void 0}function ic(a){if(a==null)return a;if(typeof a==="string"&&a)a=+a;else if(typeof a!=="number")return;return $b(a)?a|0:void 0} +function jc(a){var b=a.length;if(a[0]==="-"?b<20||b===20&&a<="-9223372036854775808":b<19||b===19&&a<="9223372036854775807")return a;if(a.length<16)Tb(Number(a));else if(kb())a=BigInt(a),E=Number(a&BigInt(4294967295))>>>0,F=Number(a>>BigInt(32)&BigInt(4294967295));else{b=+(a[0]==="-");F=E=0;for(var c=a.length,d=0+b,e=(c-b)%6+b;e<=c;d=e,e+=6)d=Number(a.slice(d,e)),F*=1E6,E=E*1E6+d,E>=4294967296&&(F+=Math.trunc(E/4294967296),F>>>=0,E>>>=0);b&&(b=v(Ub(E,F)),a=b.next().value,b=b.next().value,E=a,F=b)}return Xb()} +function kc(a){fc(a);a=ac(a);if(!Zb(a)){Tb(a);var b=E,c=F;if(a=c&2147483648)b=~b+1>>>0,c=~c>>>0,b==0&&(c=c+1>>>0);var d=c*4294967296+(b>>>0);b=Number.isSafeInteger(d)?d:Vb(b,c);a=typeof b==="number"?a?-b:b:a?"-"+b:b}return a}function lc(a){fc(a);a=ac(a);Zb(a)?a=String(a):(Tb(a),a=Xb());return a} +function mc(a,b){b=b===void 0?!1:b;var c=typeof a;if(a==null)return a;if(c==="bigint")return String(Yb(64,a));if(fc(a))return c==="string"?(fc(a),b=ac(Number(a)),Zb(b)?a=String(b):(b=a.indexOf("."),b!==-1&&(a=a.substring(0,b)),a=jc(a))):a=b?lc(a):kc(a),a} +function nc(a){var b=typeof a;if(a==null)return a;if(b==="bigint")return Kb(Yb(64,a));if(fc(a))return b==="string"?(b=ac(Number(a)),Zb(b)?a=Kb(b):(b=a.indexOf("."),b!==-1&&(a=a.substring(0,b)),a=kb()?Kb(Yb(64,BigInt(a))):Kb(jc(a)))):a=Zb(a)?Kb(kc(a)):Kb(lc(a)),a}function oc(a){return a==null||typeof a==="string"?a:void 0}function pc(a,b,c,d){if(a!=null&&a[tb]===Ab)return a;if(!Array.isArray(a))return c?d&2?b[ob]||(b[ob]=qc(b)):new b:void 0;c=a[C]|0;d=c|d&32|d&2;d!==c&&D(a,d);return new b(a)} +function qc(a){a=new a;zb(a.A);return a};function rc(a){return a};function sc(){}function tc(a,b){for(var c in a)!isNaN(c)&&b(a,+c,a[c])}function uc(a){var b=new sc;tc(a,function(c,d,e){b[d]=Array.prototype.slice.call(e)});b.g=a.g;return b}function vc(a,b){b<100||jb(rb,1)};function wc(a,b,c,d){var e=d!==void 0;d=!!d;var f=Ia(qb),g;!e&&lb&&f&&(g=a[f])&&tc(g,vc);f=[];var h=a.length;g=4294967295;var k=!1,l=!!(b&64),m=l?b&128?0:-1:void 0;if(!(b&1)){var t=h&&a[h-1];t!=null&&typeof t==="object"&&t.constructor===Object?(h--,g=h):t=void 0;if(l&&!(b&128)&&!e){k=!0;var r;g=((r=xc)!=null?r:rc)(g-m,m,a,t,void 0)+m}}b=void 0;for(r=0;r=g){var K=r-m,P=void 0;((P=b)!=null?P:b={})[K]=z}else f[r]=z}if(t)for(var ma in t)h=t[ma], +h!=null&&(h=c(h,d))!=null&&(r=+ma,z=void 0,l&&!Number.isNaN(r)&&(z=r+m)>2];l=c[(l&3)<<4|m>>4];m=c[(m&15)<<2|k>>6];k=c[k&63];d[f++]=""+h+l+m+k}h=0;k=e;switch(b.length-g){case 2:h= +b[g+1],k=c[(h&15)<<2]||e;case 1:b=b[g],d[f]=""+c[b>>2]+c[(b&3)<<4|h>>4]+k+e}b=d.join("")}a=a.g=b}return a}return}return a}var Ac=cb?structuredClone:function(a){return wc(a,0,yc)},xc;function zc(a){a=a.A;return wc(a,a[C]|0,yc)};function G(a,b,c){return Bc(a,b,c,2048)} +function Bc(a,b,c,d){d=d===void 0?0:d;if(a==null){var e=32;c?(a=[c],e|=128):a=[];b&&(e=e&-16760833|(b&1023)<<14)}else{if(!Array.isArray(a))throw Error("narr");e=a[C]|0;if(Ma&&1&e)throw Error("rfarr");2048&e&&!(2&e)&&Cc();if(e&256)throw Error("farr");if(e&64)return(e|d)!==e&&D(a,e|d),a;if(c&&(e|=128,c!==a[0]))throw Error("mid");a:{c=a;e|=64;var f=c.length;if(f){var g=f-1,h=c[g];if(h!=null&&typeof h==="object"&&h.constructor===Object){b=e&128?0:-1;g-=b;if(g>=1024)throw Error("pvtlmt");for(var k in h)f= ++k,f1024)throw Error("spvt");e=e&-16760833|(k&1023)<<14}}}D(a,e|64|d);return a}function Cc(){if(Ma)throw Error("carr");jb(sb,5)};function Dc(a,b){if(typeof a!=="object")return a;if(Array.isArray(a)){var c=a[C]|0;a.length===0&&c&1?a=void 0:c&2||(!b||4096&c||16&c?a=Ec(a,c,!1,b&&!(c&16)):(yb(a,34),c&4&&Object.freeze(a)));return a}if(a!=null&&a[tb]===Ab)return b=a.A,c=b[C]|0,Bb(a,c)?a:Fc(a,b,c)?Gc(a,b):Ec(b,c);if(a instanceof db)return a}function Gc(a,b,c){a=new a.constructor(b);c&&(a.g=Cb);a.j=Cb;return a}function Ec(a,b,c,d){d!=null||(d=!!(34&b));a=wc(a,b,Dc,d);d=32;c&&(d|=2);b=b&16769217|d;D(a,b);return a} +function Hc(a){var b=a.A,c=b[C]|0;return Bb(a,c)?Fc(a,b,c)?Gc(a,b,!0):new a.constructor(Ec(b,c,!1)):a}function Ic(a){if(a.g!==Cb)return!1;var b=a.A;b=Ec(b,b[C]|0);yb(b,2048);a.A=b;a.g=void 0;a.j=void 0;return!0}function Jc(a,b){b===void 0&&(b=a[C]|0);b&32&&!(b&4096)&&D(a,b|4096)}function Fc(a,b,c){return c&2?!0:c&32&&!(c&4096)?(D(b,c|2),a.g=Cb,!0):!1};var Kc=Kb(0),Lc={};function H(a,b,c,d,e){Object.isExtensible(a);b=Mc(a.A,b,c,e);if(b!==null||d&&a.j!==Cb)return b}function Mc(a,b,c,d){if(b===-1)return null;var e=b+(c?0:-1),f=a.length-1;if(!(f<1+(c?0:-1))){if(e>=f){var g=a[f];if(g!=null&&typeof g==="object"&&g.constructor===Object){c=g[b];var h=!0}else if(e===f)c=g;else return}else c=a[e];if(d&&c!=null){d=d(c);if(d==null)return d;if(!Object.is(d,c))return h?g[b]=d:a[e]=d,d}return c}} +function Nc(a,b,c){if(!Ic(a)&&Bb(a,a.A[C]|0))throw Error();var d=a.A;Oc(d,d[C]|0,b,c);return a}function Oc(a,b,c,d){var e=c+-1,f=a.length-1;if(f>=0&&e>=f){var g=a[f];if(g!=null&&typeof g==="object"&&g.constructor===Object)return g[c]=d,b}if(e<=f)return a[e]=d,b;if(d!==void 0){var h;f=((h=b)!=null?h:b=a[C]|0)>>14&1023||536870912;c>=f?d!=null&&(e={},a[f+-1]=(e[c]=d,e)):a[e]=d}return b} +function Pc(a,b,c,d,e,f,g,h){var k=b;f===1||(f!==4?0:2&b||!(16&b)&&32&d)?Qc(b)||(b|=!a.length||g&&!(4096&b)||32&d&&!(4096&b||16&b)?2:256,b!==k&&D(a,b),Object.freeze(a)):(f===2&&Qc(b)&&(a=Array.prototype.slice.call(a),k=0,b=Rc(b,d),d=Oc(c,d,e,a)),Qc(b)||(h||(b|=16),b!==k&&D(a,b)));2&b||!(4096&b||16&b)||Jc(c,d);return a}function Sc(a,b){a=Mc(a,b);return Array.isArray(a)?a:wb}function Tc(a,b){2&b&&(a|=2);return a|1}function Qc(a){return!!(2&a)&&!!(4&a)||!!(256&a)} +function Uc(a){return a==null?a:typeof a==="string"?a?new db(a,bb):eb():a.constructor===db?a:$a&&a!=null&&a instanceof Uint8Array?a.length?new db(new Uint8Array(a),bb):eb():void 0}function Vc(a,b,c){return Wc(a,b)===c?c:-1} +function Wc(a,b){a=a.A;if(lb){var c;var d=(c=a[pb])!=null?c:a[pb]=new Map}else pb in a?d=a[pb]:(c=new Map,Object.defineProperty(a,pb,{value:c}),d=c);c=d;d=void 0;var e=c.get(b);if(e==null){for(var f=e=0;f>>0)}p=xd.prototype;p.isSafeInteger=function(){var a=this.G>>21;return a==0||a==-1&&!(this.I==0&&this.G==-2097152)}; +p.toString=function(a){a=a||10;if(a<2||36>2);var c=Math.pow(a,b),d=L(c,c/4294967296);c=this.div(d);var e=Math,f=e.abs;d=c.multiply(d);d=this.add(zd(d));e=f.call(e,yd(d));f=a==10?""+e:e.toString(a);f.length>>0>a.I>>>0?1:-1:this.G>a.G?1:-1};function zd(a){var b=~a.I+1|0;return L(b,~a.G+!b|0)}p.add=function(a){var b=this.G>>>16,c=this.G&65535,d=this.I>>>16,e=a.G>>>16,f=a.G&65535,g=a.I>>>16;a=(this.I&65535)+(a.I&65535);g=(a>>>16)+(d+g);d=g>>>16;d+=c+f;return L((g&65535)<<16|a&65535,((d>>>16)+(b+e)&65535)<<16|d&65535)}; +p.multiply=function(a){if(Ad(this))return this;if(Ad(a))return a;var b=this.G>>>16,c=this.G&65535,d=this.I>>>16,e=this.I&65535,f=a.G>>>16,g=a.G&65535,h=a.I>>>16;a=a.I&65535;var k=e*a;var l=(k>>>16)+d*a;var m=l>>>16;l=(l&65535)+e*h;m+=l>>>16;m+=c*a;var t=m>>>16;m=(m&65535)+d*h;t+=m>>>16;m=(m&65535)+e*g;t=t+(m>>>16)+(b*a+c*h+d*g+e*f)&65535;return L((l&65535)<<16|k&65535,t<<16|m&65535)}; +p.div=function(a){if(Ad(a))throw Error("division by zero");if(this.G<0){if(this.equals(Bd)){if(a.equals(Cd)||a.equals(Dd))return Bd;if(a.equals(Bd))return Cd;var b=this.G;b=L(this.I>>>1|b<<31,b>>1);b=b.div(a).shiftLeft(1);if(b.equals(Ed))return a.G<0?Cd:Dd;var c=a.multiply(b);c=this.add(zd(c));return b.add(c.div(a))}return a.G<0?zd(this).div(zd(a)):zd(zd(this).div(a))}if(Ad(this))return Ed;if(a.G<0)return a.equals(Bd)?Ed:zd(this.div(zd(a)));b=Ed;for(c=this;c.compare(a)>=0;){var d=Math.max(1,Math.floor(yd(c)/ +yd(a))),e=Math.ceil(Math.log(d)/Math.LN2);e=e<=48?1:Math.pow(2,e-48);for(var f=Fd(d),g=f.multiply(a);g.G<0||g.compare(c)>0;)d-=e,f=Fd(d),g=f.multiply(a);Ad(f)&&(f=Cd);b=b.add(f);c=c.add(zd(g))}return b};p.and=function(a){return L(this.I&a.I,this.G&a.G)};p.or=function(a){return L(this.I|a.I,this.G|a.G)};p.xor=function(a){return L(this.I^a.I,this.G^a.G)};p.shiftLeft=function(a){a&=63;if(a==0)return this;var b=this.I;return a<32?L(b<>>32-a):L(0,b<0?a>=0x7fffffffffffffff?Gd:new xd(a,a/4294967296):a<0?a<=-0x7fffffffffffffff?Bd:zd(new xd(-a,-a/4294967296)):Ed}function L(a,b){return new xd(a,b)}var Ed=L(0,0),Cd=L(1,0),Dd=L(-1,-1),Gd=L(4294967295,2147483647),Bd=L(0,2147483648);function Hd(a,b){b=b===void 0?window:b;b=b===void 0?window:b;return(b=b.WIZ_global_data)&&a in b?b[a]:null};var Id; +function Jd(){var a=null;var b=Hd("TSDtV",window);if(b=typeof b!=="string"?null:b)a=wd("["+b.substring(4)),a=Zc(a,ud,1)[0];if(a){b=v(Zc(a,sd,2));for(var c=b.next();!c.done;c=b.next()){c=c.value;var d=c.A;if(Xc(d,d[C]|0,ld,Vc(c,td,6))!==void 0)throw Error();}}if(a)for(b={},c=v(Zc(a,sd,2)),d=c.next();!d.done;d=c.next()){var e=d.value;d=cd(e,1).toString();switch(Wc(e,td)){case 3:b[d]=ad(e,Vc(e,td,3));break;case 2:var f=cd(e,Vc(e,td,2));Lb(f);Rb(f);f=Rb(f)?Number(f):String(f);b[d]=f;break;case 4:f=void 0; +var g=e;var h=Vc(e,td,4);e=void 0;e=e===void 0?0:e;g=(f=H(g,h,void 0,void 0,bc))!=null?f:e;b[d]=g;break;case 5:b[d]=dd(e,Vc(e,td,5));break;case 6:b[d]=I(e,ld,Vc(e,td,6));break;case 8:f=Yc(e,qd,Vc(e,td,8));switch(Wc(f,rd)){case 1:b[d]=dd(f,Vc(f,rd,1));break;default:throw Error("case "+Wc(f,rd));}break;default:throw Error("case "+Wc(e,td));}}else b={};this.g=b;this.j=a?a.za():null}Jd.prototype.za=ba("j");function Kd(a){this.A=G(a)}u(Kd,J);var Ld=new nd;function Md(a){this.A=G(a)}u(Md,J);var Nd=function(a){return function(){return a[ob]||(a[ob]=qc(a))}}(Md);Object.create(null);function M(){}M.prototype.equals=function(a){return Od(this,a)};M.prototype.ra=function(){return this.D||(Object.defineProperties(this,{D:{value:Pd=Pd+1|0,enumerable:!1}}),this.D)};M.prototype.toString=function(){return N(Qd(O(Rd(this))))+"@"+N((this.ra()>>>0).toString(16))};M.prototype.C=["java.lang.Object",0];function Sd(){}u(Sd,M);function Q(a,b){a.g=b;Td(b,a)}function R(a){Ud(a.g)&&(Error.captureStackTrace?Error.captureStackTrace(S(a.g,Ud,Xd)):S(a.g,Ud,Xd).stack=Error().stack)}Sd.prototype.toString=function(){var a=Qd(O(Rd(this))),b=this.j;return b==null?a:N(a)+": "+N(b)};function Yd(a){if(a!=null){var b=a.La;if(b!=null)return b}a instanceof TypeError?b=Zd():(b=new $d,R(b),Q(b,Error(b)));b.j=a==null?"null":a.toString();Q(b,a);return b}function ae(a){return a instanceof Sd} +Sd.prototype.C=["java.lang.Throwable",0];function be(){}u(be,Sd);be.prototype.C=["java.lang.Exception",0];function T(){}u(T,be);T.prototype.C=["java.lang.RuntimeException",0];function ce(){}u(ce,T);ce.prototype.C=["java.lang.IndexOutOfBoundsException",0];var de;function ee(){ee=n();for(var a=fe(),b=0;b<256;b=b+1|0)ge(a,b,he(b-128|0));de=a};function ie(){}u(ie,T);ie.prototype.C=["java.lang.ArithmeticException",0];function je(){}u(je,T);je.prototype.C=["java.lang.ArrayStoreException",0];function ke(){}u(ke,T);ke.prototype.C=["java.lang.ClassCastException",0];function le(){}u(le,T);le.prototype.C=["java.lang.IllegalArgumentException",0];function me(){}u(me,T);function ne(a){var b=new me;b.j=a;R(b);Q(b,Error(b));return b}me.prototype.C=["java.lang.IllegalStateException",0];function $d(){}u($d,T);$d.prototype.C=["java.lang.JsException",0];function oe(){}u(oe,$d);function Zd(){var a=new oe;R(a);Q(a,new TypeError(a));return a}oe.prototype.C=["java.lang.NullPointerException",0];function pe(){}u(pe,ce);pe.prototype.C=["java.lang.StringIndexOutOfBoundsException",0];function qe(){}var re;u(qe,M);qe.prototype.C=["java.lang.Number",0];function se(){}u(se,qe);se.prototype.C=["java.lang.Double",0];function te(a){return Fd(a)}function ue(a){if(!isFinite(a))throw a=new ie,R(a),Q(a,Error(a)),a.g;return a|0};function ve(){}u(ve,M);ve.prototype.C=["java.lang.Boolean",0];function S(a,b,c){if(a!=null&&!b(a))throw a=N(Qd(we(a)))+" cannot be cast to "+N(Qd(O(c))),b=new ke,b.j=a,R(b),Q(b,Error(b)),b.g;return a};function Rd(a){return a.constructor}function xe(a,b,c){if(Object.prototype.hasOwnProperty.call(a.prototype,b))return a.prototype[b];c=c();return a.prototype[b]=c};function Od(a,b){return Object.is(a,b)||a==null&&b==null};var Pd=0;function we(a){switch(U(typeof a)){case "number":return O(se);case "boolean":return O(ve);case "string":return O(ye);case "function":return O(ze)}if(a instanceof xd)a=O(Ae);else if(a instanceof M)a=O(Rd(a));else if(Array.isArray(a))a=(a=a.ma)?O(a.Z,a.Y):O(M,1);else if(a!=null)a=O(Be);else throw new TypeError("null.getClass()");return a};function ze(){}ze.prototype.C=["",1];function Be(){}u(Be,M);Be.prototype.C=["",0];function V(){this.U=0}u(V,qe);function Ce(a){a>-129&&a<128?(ee(),a=de[a+128|0]):a=he(a);return a}function he(a){var b=new V;b.U=a;return b}V.prototype.equals=function(a){return De(a)&&S(a,De,V).U==this.U};V.prototype.ra=ba("U");V.prototype.toString=function(){return""+this.U};function De(a){return a instanceof V}V.prototype.C=["java.lang.Integer",0];function Ae(){}u(Ae,qe);Ae.prototype.C=["java.lang.Long",0];function Ee(){}u(Ee,le);Ee.prototype.C=["java.lang.NumberFormatException",0];function U(a){if(a==null)throw Zd().g;return a};function fe(){var a=[256];return Fe(a,{Z:V,la:De,Y:a.length})}function Fe(a,b){var c=a[0];if(c==null)return null;var d=new globalThis.Array(c);b&&(d.ma=b);if(a.length>1){a=a.slice(1);b=b&&{Z:b.Z,la:b.la,Y:b.Y-1};for(var e=0;e1){d=e.Z;var f=e.la;e=e.Y-1;if(c!=null&&Array.isArray(c)){var g=c.ma||{Z:M,Y:1},h=g.Y;h==e?(e=g.Z,d=e===d?!0:d&&d.prototype.Ca||e&&e.prototype.Ca?!1:f(e.prototype)):d=h>e?M==d:!1}else d=!1;if(!d){d=!1;break a}}else if(c!=null&&!e.la(c)){d=!1;break a}d=!0}if(!d)throw a=new je,R(a),Q(a,Error(a)),a.g;a[b]=c};function ye(){}u(ye,M);function N(a){return a==null?"null":a.toString()}function Ge(a){if(!(a>=0))throw a=new le,R(a),Q(a,Error(a)),a.g;return"0".repeat(a)}ye.prototype.C=["java.lang.String",0];function He(a,b){this.g=a;this.j=b}u(He,M);function O(a,b){var c=b||0;return xe(a,"$$class/"+c,function(){return new He(a,c)})}function Qd(a){return a.j!=0?N(Ie("[",a.j))+N(a.g.prototype.C[1]==3?a.g.prototype.C[2]:"L"+N(a.g.prototype.C[0])+";"):a.g.prototype.C[0]}function Je(a,b){b=a.lastIndexOf(b)+1|0;var c=a.length+1|0;if(b<0||b>=c)throw a=new pe,a.j="Index: "+b+", Size: "+c,R(a),Q(a,Error(a)),a.g;return a.substr(b)} +He.prototype.toString=function(){return String(this.j==0&&this.g.prototype.C[1]==1?"interface ":this.j==0&&this.g.prototype.C[1]==3?"":"class ")+N(Qd(this))};function Ie(a,b){for(var c="",d=0;d>>0).toString(16);b=N(Ge(Math.max(0,8-b.length|0)))+N(b);a=(a(2147483647)>>>0).toString(16);return N(a)+N(b)};function Oe(){}function Pe(a){return a instanceof Array}Oe.prototype.C=["Array",0];function Qe(){}function Re(a){return a instanceof Object}Qe.prototype.C=["Object",0];function Se(){}function Te(a){return a instanceof Object}Se.prototype.C=["Object",0];var Ue={Ob:"build-label",rb:"buildLabel",sb:"clientLog",xb:"docId",Qb:"mobile-app-version",ac:"severity",fc:"severity-unprefixed",Ib:"isArrayPrototypeIntact",Jb:"isEditorElementAttached",Cb:"documentCharacterSet",Lb:"isModuleLoadFailure",Yb:"reportName",Pb:"locale",ub:"createdOnServer",Ub:"numUnsavedCommands",wb:"cspViolationContext",Xb:"relatedToBrowserExtension",jc:"workerError",yb:"docosPostLimitExceeded",zb:"docosPostLimitType",Ab:"docosReactionLimitExceeded",Bb:"docosReactionLimitType",Wb:"origin", +Zb:"saveTakingTooLongOnClient",cc:"truncatedCommentNotificationsCount",dc:"truncatedCommentNotificationsFromPayload",Tb:"nonfatalReason",hc:"usesModuleSetsServing"};function Ve(){this.g=!1}var We;u(Ve,M);p=Ve.prototype;p.dispose=function(){if(this.g)var a=null;else this.g=!0,a=this.o==null?We:this.o,this.o=null;if(a!=null){this.na();if(a.length!=0)for(var b=0;b4);e++)b[cf(a[e])]||(c+="\nInner error "+d++ +": ",a[e].stack&&a[e].stack.indexOf(a[e].toString())==0||(c+=typeof a[e]==="string"?a[e]:a[e].message+"\n"),c+=af(a[e],b));e=0)c.push("[...circular reference...]");else if(a&&b.length<50){c.push(bf(a)+"(");for(var d=a.arguments,e=0;d&&e0&&c.push(", ");var f=d[e];switch(typeof f){case "object":f=f?"object":"null";break;case "string":break;case "number":f=String(f);break;case "boolean":f=f?"true":"false";break;case "function":f=(f=bf(f))?f:"[fn]";break;default:f=typeof f}f.length>40&&(f=f.slice(0,40)+"...");c.push(f)}b.push(a);c.push(")\n");try{c.push(gf(a.caller,b))}catch(g){c.push("[exception trying to get caller]\n")}}else a? +c.push("[...long stack...]"):c.push("[end]");return c.join("")}function bf(a){if(hf[a])return hf[a];a=String(a);if(!hf[a]){var b=/function\s+([^\(]+)/m.exec(a);hf[a]=b?b[1]:"[Anonymous]"}return hf[a]}var hf={};function jf(a,b){this.name=a;this.value=b}jf.prototype.toString=ba("name");var kf=new jf("SEVERE",1E3),lf=new jf("WARNING",900),mf=new jf("CONFIG",700);function nf(){this.clear()}var of;function pf(a){var b=qf(),c=b.g;if(c[0]){var d=b.j;b=b.l?d:-1;do b=(b+1)%0,a(c[b]);while(b!==d)}}nf.prototype.clear=function(){this.g=[];this.j=-1;this.l=!1};function qf(){of||(of=new nf);return of};function rf(a,b,c,d,e,f,g){var h="";a&&(h+=a+":");c&&(h+="//",b&&(h+=b+"@"),h+=c,d&&(h+=":"+d));e&&(h+=e);f&&(h+="?"+f);g&&(h+="#"+g);return h}var sf=RegExp("^(?:([^:/?#.]+):)?(?://(?:([^\\\\/?#]*)@)?([^\\\\/?#]*?)(?::([0-9]+))?(?=[\\\\/?#]|$))?([^?#]+)?(?:\\?([^#]*))?(?:#([\\s\\S]*))?$"); +function tf(a,b){if(a){a=a.split("&");for(var c=0;c=0){var f=a[c].substring(0,d);e=a[c].substring(d+1)}else f=a[c];b(f,e?decodeURIComponent(e.replace(/\+/g," ")):"")}}}function uf(a,b){if(!b)return a;var c=a.indexOf("#");c<0&&(c=a.length);var d=a.indexOf("?");if(d<0||d>c){d=c;var e=""}else e=a.substring(d+1,c);a=[a.slice(0,d),e,a.slice(c)];c=a[1];a[1]=b?c?c+"&"+b:b:c;return a[0]+(a[1]?"?"+a[1]:"")+a[2]} +function vf(a,b,c){if(Array.isArray(b))for(var d=0;d0){this.j--;var a=this.g;this.g=a.next;a.next=null}else a=this.l();return a};function Ff(a,b){a.o(b);a.j<100&&(a.j++,b.next=a.g,a.g=b)};var Gf=[],Hf=[],If=!1;function Jf(a){Gf[Gf.length]=a;if(If)for(var b=0;b1)));g=g.next)e||(f=g);e&&(c.g==0&&d==1?jg(c,b):(f?(d=f,d.next==c.o&&(c.o=d),d.next=d.next.next):kg(c),lg(c,e,3,b)))}a.l=null}else Vf(a,3,b)}function mg(a,b){a.j||a.g!=2&&a.g!=3||ng(a);a.o?a.o.next=b:a.j=b;a.o=b} +function hg(a,b,c,d){var e=Yf(null,null,null);e.g=new X(function(f,g){e.o=b?function(h){try{var k=b.call(d,h);f(k)}catch(l){g(l)}}:f;e.j=c?function(h){try{var k=c.call(d,h);k===void 0&&h instanceof ig?g(h):f(k)}catch(l){g(l)}}:g});e.g.l=a;mg(a,e);return e.g}p.nb=function(a){this.g=0;Vf(this,2,a)};p.ob=function(a){this.g=0;Vf(this,3,a)}; +function Vf(a,b,c){a.g==0&&(a===c&&(b=3,c=new TypeError("Promise cannot resolve to itself")),a.g=1,bg(c,a.nb,a.ob,a)||(a.J=c,a.g=b,a.l=null,ng(a),b!=3||c instanceof ig||og(a,c)))}function bg(a,b,c,d){if(a instanceof X)return mg(a,Yf(b||Tf,c||null,d)),!0;if(Uf(a))return a.then(b,c,d),!0;if(Ba(a))try{var e=a.then;if(typeof e==="function")return pg(a,e,b,c,d),!0}catch(f){return c.call(d,f),!0}return!1} +function pg(a,b,c,d,e){function f(k){h||(h=!0,d.call(e,k))}function g(k){h||(h=!0,c.call(e,k))}var h=!1;try{b.call(a,g,f)}catch(k){f(k)}}function ng(a){a.v||(a.v=!0,Qf(a.Ua,a))}function kg(a){var b=null;a.j&&(b=a.j,a.j=b.next,b.next=null);a.j||(a.o=null);return b}p.Ua=function(){for(var a;a=kg(this);)lg(this,a,this.g,this.J);this.v=!1}; +function lg(a,b,c,d){if(c==3&&b.j&&!b.D)for(;a&&a.D;a=a.l)a.D=!1;if(b.g)b.g.l=null,qg(b,c,d);else try{b.D?b.o.call(b.l):qg(b,c,d)}catch(e){rg.call(null,e)}Ff(Xf,b)}function qg(a,b,c){b==2?a.o.call(a.l,c):a.j&&a.j.call(a.l,c)}function og(a,b){a.D=!0;Qf(function(){a.D&&rg.call(null,b)})}var rg=Ja;function ig(a){A.call(this,a);this.g=!1}y(ig,A);ig.prototype.name="cancel";function gg(a,b,c){this.promise=a;this.resolve=b;this.reject=c};/* + + Copyright 2005, 2007 Bob Ippolito. All Rights Reserved. + Copyright The Closure Library Authors. + SPDX-License-Identifier: MIT +*/ +function sg(){this.D=[];this.o=this.l=!1;this.j=void 0;this.F=this.K=this.J=!1;this.v=0;this.g=null;this.B=0}sg.prototype.cancel=function(a){if(this.l)this.j instanceof sg&&this.j.cancel();else{if(this.g){var b=this.g;delete this.g;a?b.cancel(a):(b.B--,b.B<=0&&b.cancel())}this.F=!0;this.l||(a=new tg(this),ug(this),vg(this,!1,a))}};sg.prototype.H=function(a,b){this.J=!1;vg(this,a,b)};function vg(a,b,c){a.l=!0;a.j=c;a.o=!b;wg(a)}function ug(a){if(a.l){if(!a.F)throw new xg(a);a.F=!1}} +function yg(a){throw a;}function zg(a,b,c){return Ag(a,b,null,c)}function Bg(a,b,c){Ag(a,b,function(d){var e=b.call(this,d);if(e===void 0)throw d;return e},c)}function Ag(a,b,c,d){var e=a.l;e||(b===c?b=c=Df(b):(b=Df(b),c=Df(c)));a.D.push([b,c,d]);e&&wg(a);return a}sg.prototype.then=function(a,b,c){var d,e,f=new X(function(g,h){e=g;d=h});Ag(this,e,function(g){g instanceof tg?f.cancel():d(g);return Cg},this);return f.then(a,b,c)};sg.prototype.$goog_Thenable=!0; +function Dg(a){return Ta(a.D,function(b){return typeof b[1]==="function"})}var Cg={}; +function wg(a){if(a.v&&a.l&&Dg(a)){var b=a.v,c=Eg[b];c&&(w.clearTimeout(c.g),delete Eg[b]);a.v=0}a.g&&(a.g.B--,delete a.g);b=a.j;for(var d=c=!1;a.D.length&&!a.J;){var e=a.D.shift(),f=e[0],g=e[1];e=e[2];if(f=a.o?g:f)try{var h=f.call(e||null,b);h===Cg&&(h=void 0);h!==void 0&&(a.o=a.o&&(h==b||h instanceof Error),a.j=b=h);if(Uf(b)||typeof w.Promise==="function"&&b instanceof w.Promise)d=!0,a.J=!0}catch(k){b=k,a.o=!0,Dg(a)||(c=!0)}}a.j=b;d&&(h=x(a.H,a,!0),d=x(a.H,a,!1),b instanceof sg?(Ag(b,h,d),b.K=!0): +b.then(h,d));c&&(b=new Gg(b),Eg[b.g]=b,a.v=b.g)}function Hg(a){var b=new sg;ug(b);vg(b,!0,a);return b}function xg(){A.call(this)}y(xg,A);xg.prototype.message="Deferred has already fired";xg.prototype.name="AlreadyCalledError";function tg(){A.call(this)}y(tg,A);tg.prototype.message="Deferred was canceled";tg.prototype.name="CanceledError";function Gg(a){this.g=w.setTimeout(x(this.l,this),0);this.j=a}Gg.prototype.l=function(){delete Eg[this.g];yg(this.j)};var Eg={};function Ig(){}function Jg(a){return a!=null&&!!a.wa}Ig.prototype.wa=!0;Ig.prototype.C=["javax.inject.Provider",1];function Kg(){}function Lg(a){return a!=null&&!!a.va}Kg.prototype.va=!0;Kg.prototype.C=["com.google.apps.docs.xplat.flag.FlagService",1];var Mg;function Ng(){if(Mg==null){var a=new Og(null);Mg=function(){return a}}var b;return S((b=Mg,b()),Lg,Kg)};function Pg(){}u(Pg,M);Pg.prototype.get=function(){if(this.j==null){var a=S(w._docs_flag_initialData,Re,Qe);this.j=a!=null?a:S({},Re,Qe)}return this.j};Pg.prototype.g=function(){return this.get()};Pg.prototype.wa=!0;Pg.prototype.C=["com.google.apps.docs.xplat.flag.FlagServiceHelper",0];function Qg(a){return typeof a=="string"?a=="true"||a=="1":!!a};function Og(a){this.g=new Pg;this.j=null;if(a!=null)for(var b in a){var c=b,d=a[b];if(this.j!=null)throw ne("Cannot use setClientFlag when comparison is enabled.").g;var e=S(this.g.g(),Re,Qe);De(d)?(d=S(d,De,V).U,e[c]=d):e[c]=d!=null?d:null}}u(Og,M);Og.prototype.clear=function(){this.g=new Pg;this.j=null};Og.prototype.get=function(a){Rg(this,a);return S(this.g.g(),Re,Qe)[a]};function Sg(a,b){a=S(a.g.g(),Re,Qe);return b in a} +function Tg(a,b){Rg(a,b);if(!Sg(a,b)||a.get(b)==null)return NaN;try{var c=N(a.get(b));re==null&&(re=RegExp("^\\s*[+-]?(NaN|Infinity|((\\d+\\.?\\d*)|(\\.\\d+))([eE][+-]?\\d+)?[dDfF]?)\\s*$"));if(!re.test(c)){var d=new Ee;d.j='For input string: "'+N(c)+'"';R(d);Q(d,Error(d));throw d.g;}return parseFloat(c)}catch(f){var e=Yd(f);if(e instanceof Ee)return NaN;throw e.g;}} +function Ug(a,b){Rg(a,b);if(!Sg(a,b))return"";a=a.get(b);if(a==null)a="";else{if(b="number"===typeof a){b=te(U(a));var c=te(U(a));b=b.equals(c)}a=b?""+te(U(a)):N(a)}return a} +function Rg(a,b){if(a.j!=null){try{var c=S(a.g.g(),Re,Qe)[b]}catch(h){var d=Yd(h);if(d instanceof T)c="injection-failed";else throw d.g;}try{var e=a.j;if(e==null)throw Zd().g;var f=S(S(e,Jg,Ig).g(),Re,Qe)[b]}catch(h){var g=Yd(h);if(g instanceof T)f="injection-failed";else throw g.g;}a=c;!(b=Od(a,f))&&(b=a!=null)&&(b=a.equals?a.equals(f):Object.is(a,f));if(!b)throw ne("Logging is not supported.").g;}}Og.prototype.va=!0;Og.prototype.C=["com.google.apps.docs.xplat.flag.FlagServiceImpl",0];function Vg(a){Ke.call(this,a,null);Q(this,Error(this))}u(Vg,Ke);Vg.prototype.C=["com.google.apps.docs.xplat.net.LimitException",0];function Wg(a,b,c,d){Xe();this.g=!1;this.v=a;this.l=b;this.j=new Xg(Math.imul(c,1E3),d)}u(Wg,Ve);function Yg(a){if(!((a.j.get(null)+1|0)/U(a.j.l/1E3)<=a.l))throw(new Vg("Query would cause "+N(a.v)+" to exceed "+a.l+" qps.")).g;a=a.j;var b=yd(Fd(Date.now()));Zg(a,b);var c=S($g(a.g),ah,bh);if(c==null||U(b)>=U(c.j))b=ch(a,U(b)),c=new bh,c.j=b,c.g=0,c.o=2147483647,c.l=-2147483648,a.g.add(c);c.g=c.g+1|0;c.o=Math.min(1,c.o);c.l=Math.max(1,c.l)} +Wg.prototype.C=["com.google.apps.docs.xplat.net.QpsLimiter",0];function bh(){this.l=this.o=this.g=0}u(bh,M);function ah(a){return a instanceof bh}bh.prototype.C=["com.google.apps.docs.xplat.util.BasicStat$Slot",0];function Xg(a){this.j=0;this.l=a;this.j=ue(a/50);this.g=new dh(Ce(50))}u(Xg,M);Xg.prototype.get=function(a){return eh(this,a,function(b,c){b=S(b,De,V);c=S(c,ah,bh);return Ce(b.U+c.g|0)})};function eh(a,b,c){b=b!=null?U(b):yd(Fd(Date.now()));Zg(a,b);var d=0;b=ch(a,U(b));b=U(b)-a.l;for(var e=a.g.g.length-1|0;e>=0;e=e-1|0){var f=S(a.g.get(e),ah,bh);if(U(f.j)<=b)break;d=S(c(Ce(d),f),De,V).U}return d}function ch(a,b){return a.j*Math.floor(b/a.j+1)} +function Zg(a,b){var c=S($g(a.g),ah,bh);c!=null&&(c=U(c.j)-a.j,U(b)=a.g.length)throw a=new ce,R(a),Q(a,Error(a)),a.g;return a.g.length1||f.length==1&& +f[0]!="")&&f.pop(),d&&g==e.length&&f.push("")):(f.push(h),d=!0)}d=f.join("/")}else d=e}c?vh(b,d):c=a.l.toString()!=="";c?wh(b,a.l.clone()):c=!!a.v;c&&(b.v=a.v);return b};sh.prototype.clone=function(){return new sh(this)};function th(a,b,c){a.o=c?xh(b,!0):b;a.o&&(a.o=a.o.replace(/:$/,""));return a}function uh(a,b){if(b){b=Number(b);if(isNaN(b)||b<0)throw Error("Bad port number "+b);a.B=b}else a.B=null}function vh(a,b,c){a.j=c?xh(b,!0):b;return a} +function wh(a,b,c){b instanceof yh?(a.l=b,Eh(a.l,a.D)):(c||(b=zh(b,Fh)),a.l=new yh(b,a.D))}function Gh(a,b,c){a.l.set(b,c);return a}function xh(a,b){return a?b?decodeURI(a.replace(/%25/g,"%2525")):decodeURIComponent(a):""}function zh(a,b,c){return typeof a==="string"?(a=encodeURI(a).replace(b,Hh),c&&(a=a.replace(/%25([0-9a-fA-F]{2})/g,"%$1")),a):null}function Hh(a){a=a.charCodeAt(0);return"%"+(a>>4&15).toString(16)+(a&15).toString(16)}var Ah=/[#\/\?@]/g,Ch=/[#\?:]/g,Bh=/[#\?]/g,Fh=/[#\?@]/g,Dh=/#/g; +function yh(a,b){this.j=this.g=null;this.l=a||null;this.o=!!b}function Ih(a){a.g||(a.g=new Map,a.j=0,a.l&&tf(a.l,function(b,c){a.add(decodeURIComponent(b.replace(/\+/g," ")),c)}))}p=yh.prototype;p.add=function(a,b){Ih(this);this.l=null;a=Jh(this,a);var c=this.g.get(a);c||this.g.set(a,c=[]);c.push(b);this.j=this.j+1;return this};p.remove=function(a){Ih(this);a=Jh(this,a);return this.g.has(a)?(this.l=null,this.j=this.j-this.g.get(a).length,this.g.delete(a)):!1}; +p.clear=function(){this.g=this.l=null;this.j=0};function Kh(a,b){Ih(a);b=Jh(a,b);return a.g.has(b)}p.forEach=function(a,b){Ih(this);this.g.forEach(function(c,d){c.forEach(function(e){a.call(b,e,d,this)},this)},this)};p.qa=function(a){Ih(this);var b=[];if(typeof a==="string")Kh(this,a)&&(b=b.concat(this.g.get(Jh(this,a))));else{a=Array.from(this.g.values());for(var c=0;c0?String(a[0]):b}; +p.toString=function(){if(this.l)return this.l;if(!this.g)return"";for(var a=[],b=Array.from(this.g.keys()),c=0;c0)){this.l=null;d=this.g;var f=d.set;e=Jh(this,e);var g=c.length;if(g>0){for(var h=Array(g),k=0;k-1?(b=a[g],c||(b.fa=!1)):(b=new Sh(b,this.src,f,!!d,e),b.fa=c,a.push(b));return b};Uh.prototype.remove=function(a,b,c,d){a=a.toString();if(!(a in this.g))return!1;var e=this.g[a];b=Vh(e,b,c,d);return b>-1?(Th(e[b]),Array.prototype.splice.call(e,b,1),e.length==0&&(delete this.g[a],this.j--),!0):!1}; +function Wh(a,b){var c=b.type;c in a.g&&Ua(a.g[c],b)&&(Th(b),a.g[c].length==0&&(delete a.g[c],a.j--))}Uh.prototype.removeAll=function(a){a=a&&a.toString();var b=0,c;for(c in this.g)if(!a||c==a){for(var d=this.g[c],e=0;e-1?b[a]:null)&&ii(c))} +function ii(a){if(typeof a!=="number"&&a&&!a.removed){var b=a.src;if(b&&b[Qh])Wh(b.j,a);else{var c=a.type,d=a.proxy;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(fi(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Zh--;(c=di(b))?(Wh(c,a),c.j==0&&(c.src=null,b[Xh]=null)):Th(a)}}}function fi(a){return a in Yh?Yh[a]:Yh[a]="on"+a} +function gi(a,b){if(a.removed)a=!0;else{b=new Ph(b,this);var c=a.listener,d=a.ja||a.src;a.fa&&ii(a);a=c.call(d,b)}return a}function di(a){a=a[Xh];return a instanceof Uh?a:null}var ji="__closure_events_fn_"+(Math.random()*1E9>>>0);function bi(a){if(typeof a==="function")return a;a[ji]||(a[ji]=function(b){return a.handleEvent(b)});return a[ji]}Jf(function(a){gi=a(gi)});function ki(a,b){Nh.call(this,a);this.error=b}u(ki,Nh);var li=/\/d\/([^\/]+)/,mi=/\/r\/([^\/]+)/;function ni(a){a=a.match(sf)[5]||null;return li.test(a)}function oi(a,b){if(ni(a)){ni(a);a=a.match(sf);var c=a[5];c=c.replace(b,"");b=rf(a[1],a[2],a[3],a[4],c,a[6],a[7])}else b=a;return b};function Z(){W.call(this);this.j=new Uh(this);this.Da=this;this.P=null}y(Z,W);Z.prototype[Qh]=!0;p=Z.prototype;p.addEventListener=function(a,b,c,d){$h(this,a,b,c,d)};p.removeEventListener=function(a,b,c,d){hi(this,a,b,c,d)}; +p.dispatchEvent=function(a){var b=this.P;if(b){var c=[];for(var d=1;b;b=b.P)c.push(b),++d}b=this.Da;d=a.type||a;if(typeof a==="string")a=new Nh(a,b);else if(a instanceof Nh)a.target=a.target||b;else{var e=a;a=new Nh(d,b);rh(a,e)}e=!0;var f;if(c)for(f=c.length-1;!a.j&&f>=0;f--){var g=a.currentTarget=c[f];e=pi(g,d,!0,a)&&e}a.j||(g=a.currentTarget=b,e=pi(g,d,!0,a)&&e,a.j||(e=pi(g,d,!1,a)&&e));if(c)for(f=0;!a.j&&f2147483647?-1:w.setTimeout(a,b||0)}function ri(){var a=null;return(new X(function(b,c){a=qi(function(){b(void 0)},2E3);a==-1&&c(Error("Failed to schedule timer."))})).V(function(b){w.clearTimeout(a);throw b;})};function si(a,b,c){W.call(this);this.g=a;this.l=b||0;this.j=c;this.o=x(this.Sa,this)}y(si,W);p=si.prototype;p.ba=0;p.L=function(){si.T.L.call(this);this.stop();delete this.g;delete this.j};p.start=function(a){this.stop();this.ba=qi(this.o,a!==void 0?a:this.l)};p.stop=function(){this.isActive()&&w.clearTimeout(this.ba);this.ba=0};p.isActive=function(){return this.ba!=0};p.Sa=function(){this.ba=0;this.g&&this.g.call(this.j)};function ti(a,b,c,d){W.call(this);this.l=d!=null?d:.15;this.v=a;this.o=b;this.F=c;this.g=new si(this.jb,void 0,this);this.B=Number.NEGATIVE_INFINITY;this.j=0}u(ti,W);p=ti.prototype;p.isActive=function(){return this.g.isActive()};p.start=function(){ui(this,!1,!1)};function ui(a,b,c){b&&(a.g.stop(),vi(a,a.o));a.isActive()||(b=Math.max(0,a.B+a.j-Date.now()),b==0&&(c?b=vi(a,a.o):a.j=0),a.g.start(b))}p.stop=function(){this.g.stop()}; +function vi(a,b){b>0&&a.l!=0&&(b=Math.floor(b*(1-a.l+Math.random()*a.l*2)));return a.j=b}p.jb=function(){this.B=Date.now();vi(this,Math.min(Math.max(this.j*2,this.o),this.F));this.v()};p.L=function(){this.g.dispose();delete this.g;delete this.v;W.prototype.L.call(this)};function wi(a){W.call(this);this.j=a;this.g={}}y(wi,W);var xi=[];wi.prototype.listen=function(a,b,c,d){Array.isArray(b)||(b&&(xi[0]=b.toString()),b=xi);for(var e=0;e=3&&(h.S= +(jh(),ih));h.l.getState().g>=3||h.S!==(jh(),ih)||zi(h)});this.R=g;this.K=Qg(this.O.get("docs-epfdfjes"));this.da={}}u(yi,W);p=yi.prototype;p.send=function(a,b,c,d){Qg(this.O.get("docs-dafjera"))&&(a=oi(oi(a,mi),li));var e=zg(zg(Hg(this.o.length),function(f){if(!(f>=this.ea))return this.R&&(a=yf(a,"errorSender_enqueueTimeMs",Date.now().toString())),f={},f.u=a,f.m=b,f.c=c,f.h=d,this.enqueue(f)},this),this.sa,this);Bg(e,function(){this.P.delete(e)},this);this.P.add(e)}; +p.sa=function(){var a=this.l&&this.l.getState().g>=3,b=this.ka()||this.g.isActive()||this.j.isActive()||this.N;return a||b?Hg():Ai(this)};function Ai(a){return function(){return zg(Hg(a.o[0]!==void 0?a.o[0]:null),function(b){return Bi(a,b)})}()} +function Bi(a,b){if(a.j.isActive()||a.g.isActive()||a.N)return Hg();if(!b)return a.j.stop(),Hg();if(b.u.length>4E3)return Ci(a);try{Yg(a.X);a.H=new sg;var c=b.u;a.ca!=null&&(c=yf(c,"reportingSessionId",a.ca));a.v>0&&(c=yf(c,"retryCount",a.v));a.B!=null&&(c=yf(c,"previousErrorSendStatus",a.B));a.R&&(c=yf(c,"errorSenderType",a.ya()),b.errorSender_frontIndex&&(c=yf(c,"errorSender_frontIndex",b.errorSender_frontIndex)),b.errorSender_nextIndex&&(c=yf(c,"errorSender_nextIndex",b.errorSender_nextIndex)), +b.errorSender_queueSize&&(c=yf(c,"errorSender_queueSize",b.errorSender_queueSize)));var d=Hg();a.K&&(a.da=b,d=Ci(a));var e=b.m,f=b.c,g=b.h;return zg(zg(d,function(){a.g.send(c,e,f,g)}),function(){return a.H})}catch(h){if(Ye(h)instanceof Vg)a.N=!0;else throw ff(h,{"docs-origin-class":"docs.debug.ErrorSender"});}return Hg()} +p.Za=function(){var a=Di(this.g),b=this.H,c=Ei(this.g)||a>=400&&a<=500,d=this.v>3;c||d?(this.v=0,this.B=null,this.j.stop(),zg(this.K?Hg():Ci(this),function(){ug(b);vg(b,!0)})):(this.v++,this.B=a===-1?this.g.B:a,zi(this),this.K&&this.enqueue(this.da),ug(b),vg(b,!0))};function zi(a){a.v!=1||a.j.isActive()?a.j.start():ui(a.j,!0,!0)}p.L=function(){Bf(this.F,this.j,this.g,this.M);this.P.clear();W.prototype.L.call(this)};p.ya=ca("BaseErrorSender");function Fi(a,b,c,d,e){yi.call(this,a,b,c,void 0,d,e,void 0);this.o=[]}u(Fi,yi);Fi.prototype.enqueue=function(a){this.o.push(a);return Hg()};function Ci(a){a.o.shift();return Hg()}Fi.prototype.ya=ca("MemoryErrorSender");Fi.prototype.L=function(){delete this.o;yi.prototype.L.call(this)};function Gi(a){this.g=jd(Nd(),Ac(a));a=bd(this.g,1);this.j=Math.floor(Math.random()*100) \\d+"),RegExp("getReadMode(Config|Render|Extract)")],aj=[RegExp("@file:///|phantomjs|node:electron|py-scrap|eval code|Program Files")],bj=[RegExp("Script https://meet\\.google\\.com/.*meetsw.*load failed"),RegExp("A bad HTTP response code \\(\\d+\\) was received when fetching the script")], +cj=[RegExp("Error loading.*Consecutive load failures"),RegExp("Failed to load module.*Consecutive load failures")];function dj(a,b){this.oa=a;this.ha=b}function ej(a,b){return(b=a.g(b))?{oa:a.oa,ha:a.ha,ua:b.toUpperCase()}:null};function fj(){dj.call(this,1,1)}u(fj,dj);fj.prototype.g=function(a){a:{a=gj(a);for(var b=!1,c=v(Zi),d=c.next();!d.done;d=c.next()){d=a.matchAll(d.value);d=v(d);for(var e=d.next();!e.done;e=d.next())if(e=e.value[1]){if(Yi.includes(e)){a=!1;break a}b=!0}}a=b}return a?"warning":null};function hj(a,b,c,d){this.message=a;this.g=b;this.cause=c;this.j=d}function ij(a){return(a=a.cause)?a.message+"\n"+a.g+"\n"+ij(a):""}function gj(a){return a.message+"\n"+a.g+"\n"+ij(a)}function jj(){this.j=this.g=this.message=""}function kj(a,b){a.message=b;return a};function lj(a){return a instanceof Error||a&&a.message!==void 0?a.message:mj(a)}function nj(a){return a instanceof Error||a&&a.stack!==void 0?a.stack||"":""}function oj(a,b){var c=a&&a.cause!==void 0;if(b>=3||!c)return null;c=new jj;a=a.cause;if(a instanceof Error||a.message!==void 0&&a.stack!==void 0){if(kj(c,lj(a)),c.g=nj(a),b=oj(a,b+1))c.cause=b}else kj(c,mj(a));return new hj(c.message,c.g,c.cause,c.j)} +function mj(a){try{return a&&a instanceof Object?JSON.stringify(a):String(a)}catch(b){return String(a)}}function pj(a,b){var c=kj(new jj,lj(a));c.g=nj(a);if(a=oj(a,0))c.cause=a;b&&(c.j=b);return new hj(c.message,c.g,c.cause,c.j)};function qj(a,b,c,d){dj.call(this,c,d);this.j=a;this.l=b}u(qj,dj);qj.prototype.g=function(a){var b=ij(a);return rj(a.message,this.j)||rj(a.g,this.l)||rj(b,this.j)||rj(b,this.l)?"warning":null};function rj(a,b){b=v(b);for(var c=b.next();!c.done;c=b.next())if(c.value.test(a))return!0;return!1};function sj(a,b,c,d,e){dj.call(this,c,d);this.j=a;this.o=b;this.l=e}u(sj,dj);sj.prototype.g=function(a){if(this.l)a:{a=a.message;for(var b=v(this.j),c=b.next();!c.done;c=b.next())if(a===c.value){a=!0;break a}a=!1}else a=gj(a),a=tj(a,this.j)||tj(a,this.o);return a?"warning":null};function tj(a,b){b=v(b);for(var c=b.next();!c.done;c=b.next())if(a.includes(c.value))return!0;return!1}function uj(a,b,c,d){return new sj(a,b,c,d,!1)};var vj=[new fj,uj("Trusted Type;TrustedHTML;TrustedScript;cannot communicate with background;zaloJSV2;kaspersky-labs;@user-script;Object Not Found Matching Id;contextChanged;Not implemented on this platform;Extension context invalidated;neurosurgeonundergo;realTimeClData;Failed to execute 'querySelectorAll' on 'Document';Promise.all(...).then(...).catch(...).finally is not a function;Error executing Chrome API, chrome.tabs;Identifier 'originalPrompt' has already been declared;User rejected the request;Could not inject ethereum provider because it's not your default extension;Cannot redefine property: googletag;Can't find variable: HTMLDialogElement;Identifier 'listenerName' has already been declared;Cannot read properties of undefined (reading 'info');Permission denied to access property \"type\";Error: Promise timed out;Request timeout ToolbarStatus;Can't find variable: nc;imtgo;ton is not a function;__renderMessageNode is not defined;Cannot redefine property: ethereum;unknown action:;Receiving end does not exist;get-frame-manager-configuration;Key not found;'isAWS'".split(";"), +"puppeteer-core;kaspersky-labs;@user-script;jsQuilting;linkbolic;neurosurgeonundergo;tlscdn;https://cdnjs.cloudflare.com/ajax/libs/mathjax/;secured-pixel.com;Can't find variable: nc;imtgo;_simulateEvent;goguardian".split(";"),1,0),new qj(Xi,Wi,1,0),uj('status is 0, navigator.onLine =;Network sync is disabled. Aborting a network request of int type;The service is currently unavailable.;Internal error encountered.;data does not exist in AF cache;There was an error during the transport or processing of this request;Failed to load gapi;Rpc failed due to xhr error. error code: 6, error: [0];An interceptor has requested that the request be retried;8,"generic";A network error occurred'.split(";"), +Vi,2,0),new qj($i,aj,3,0),uj("Kg is not defined;uncaught error;The play method is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.;Illegal invocation;Script error;zCommon;can't access dead object;Java exception was raised during method invocation;pauseVideo is not a function;ResizeObserver loop;wallet must has at least one account;xbrowser is not defined;jQuery is not defined;Cannot read properties of null (reading 'requestAnimationFrame');Class extends value undefined is not a constructor or null;GM3TooltipService: No tooltip with id;Mole was disposed;getInitialTopicListResponse is missing for stream rendering;getPeopleById call preempted;The operation is insecure;class heritage;The play() request was interrupted;args.site.enabledFeatures is undefined;frappe is not defined;Cannot set properties of undefined (setting 'hidden');Identifier 'checkOngoingMeeting' has already been declared;AutofillCallbackHandler;invalid wire type;zp_token;isReCreate;HTMLOUT is not defined;Shopify root is null;CanvasMaskingStrategy_Redact;_chromeNamespace;feature named `performanceMetrics`;feature named `webCompat`;enableDidUserTypeOnKeyboardLogging;Cannot redefine property: webdriver".split(";"), +["postUserData"],3,0),new qj(bj,Wi,5,0),uj("Service worker registration is disabled by MDA;An unknown error occurred when fetching the script;Operation has been aborted;Timed out while trying to start the Service Worker;The Service Worker system has shutdown;The user denied permission to use Service Worker;The script resource is behind a redirect, which is disallowed;The document is in an invalid state;ServiceWorker script evaluation failed;ServiceWorker cannot be started;Failed to access storage;Worker disallowed;encountered an error during installation".split(";"), +Vi,5,0),new qj(cj,cj,4,0),uj(["Timeout reached for loading script https://www.gstatic.com/_/apps-fileview/_/js/","Error while loading script https://www.gstatic.com/_/apps-fileview/_/js/"],Vi,4,0)],wj=new Set(["SEVERE","SEVERE_AFTER_INITIAL","UNKNOWN","FATAL",""]);function xj(a){this.j=a;this.g=!1} +function yj(a,b){var c="missing",d=new Map,e=!0;try{c=b.j;a.g&&d.set("apps_telemetry.after_downgraded_severe","true");for(var f=v(a.j),g=f.next();!g.done;g=f.next()){var h=g.value;try{var k=ej(h,b);if(k){var l=c,m=zj(a,c)?k.ua:c;Aj(k,l,m).forEach(function(r,z){d.set(z,r)});c=m;break}}catch(r){e=!1;var t=pj(r,c);d.set("apps_telemetry.handling_error",gj(t)+"\n\nclassifier: "+h.constructor.name)}}}catch(r){e=!1,a=pj(r,c),d.set("apps_telemetry.handling_error",gj(a))}d.set("apps_telemetry.processed",String(e)); +return{ua:c,Ta:d}}function Aj(a,b,c){var d=new Map;d.set("apps_telemetry.classification",a.oa.toString());d.set("apps_telemetry.classification_code",a.ha?a.ha.toString():"");d.set("apps_telemetry.incoming_severity",b);d.set("apps_telemetry.outgoing_severity",c);return d}function zj(a,b){return wj.has(b.toUpperCase())?a.g=!0:!1};function Bj(){}Bj.prototype.aa=function(){if("WorkerGlobalScope"in w&&self instanceof w.WorkerGlobalScope)return new Map;try{var a=Array.from(document.querySelectorAll("script")).filter(this.j).slice(0,30).map(this.g).join("\n")}catch(b){a="Error getting cross-origin scripts"}return(new Map).set("apps_telemetry.cross_origin_scripts",a)}; +Bj.prototype.j=function(a){var b=new RegExp(/^(?:https?:\/\/)?(?:[a-zA-Z0-9-]+\.)*google\.com(?:$|[\/#?])/);return(a=a.getAttribute("src"))?!(a.startsWith("/")||b.test(a)):!1};Bj.prototype.g=function(a){return a.innerHTML?a.outerHTML.slice(0,a.outerHTML.indexOf(a.innerHTML)):a.outerHTML};function Cj(){}Cj.prototype.aa=function(){try{var a=performance.getEntriesByType("resource").slice(-5).map(function(b){return zf(b.name)}).join("\n")}catch(b){a="Error getting last 5 resources"}return(new Map).set("apps_telemetry.resources",a)};/* + +Math.uuid.js (v1.4) +http://www.broofa.com +mailto:robert@broofa.com +Copyright (c) 2010 Robert Kieffer +Dual licensed under the MIT and GPL licenses. +*/ +var Dj="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");function Ej(a,b,c){a=a===void 0?[]:a;b=b===void 0?[]:b;c=c===void 0?[]:c;var d=a;a=[Error("uncaught error").message];var e=[];if(b.length>0){var f=e.push,g=[];b=v(b);for(var h=b.next();!h.done;h=b.next())g.push(new RegExp(h.value));f.call(e,new qj(g,g,7,0))}e.push.apply(e,pa(vj));d=v(d);for(f=d.next();!f.done;f=d.next())e.push(f.value);a.length>0&&e.push(new sj(a,[],3,5,!0));this.l=new xj(e);this.g=[new Ri,new Bj,new Cj];this.g.push.apply(this.g,pa(c));c=[];c[8]=c[13]=c[18]=c[23]="-";c[14]="4";for(a= +0;a<36;a++)c[a]||(e=0|Math.random()*16,c[a]=Dj[a==19?e&3|8:e]);this.j=c.join("")}function Fj(a,b,c,d){d["apps_telemetry.session_id"]=a.j;"apps_telemetry.processed"in d&&(d["apps_telemetry.multi_processed"]="true");var e=a.aa();(a=Gj(a,b,c,e))&&Hj(e,a.Ta);e.forEach(function(g,h){d[h]=g});var f;return(f=a==null?void 0:a.ua)!=null?f:c}function Gj(a,b,c,d){try{var e=pj(b,c);return yj(a.l,e)}catch(f){Ij(d,f,"apps_telemetry.processed")}return null} +Ej.prototype.aa=function(){var a=new Map;try{for(var b=v(this.g),c=b.next();!c.done;c=b.next())c.value.aa().forEach(function(d,e){a.set(e,d)})}catch(d){Ij(a,d,"apps_telemetry.annotated")}return a};function Hj(a,b){b.forEach(function(c,d){a.set(d,c)})}function Ij(a,b,c){a.set(c,"false");a.set("apps_telemetry.handling_error",mj(b))};function Jj(a){var b=a=a===void 0?{}:a;a=b.xa===void 0?[]:b.xa;var c=b.lb===void 0?[]:b.lb,d=b.ib===void 0?[]:b.ib;b=b.cb===void 0?[]:b.cb;try{var e=Id=Id||new Jd;var f=Ld.key in e.g?Ld.ctor(e.g[Ld.key]):Ld.defaultValue,g=void 0===Db?2:4;e=void 0;var h=f.A,k=h[C]|0,l=Bb(f,k)?1:g;e=!!e||l===3;l===2&&Ic(f)&&(h=f.A,k=h[C]|0);var m=Sc(h,1),t=m===wb?7:m[C]|0,r=Tc(t,k);if(f=4&r?!1:!0){4&r&&(m=Array.prototype.slice.call(m),t=0,r=Rc(r,k),k=Oc(h,k,1,m));for(var z=g=0;g0&&h.push(uj(c,[],6,0));d.length>0&&h.push(new qj(d,[],6,0));b.length>0&&h.push(uj(b,[],6,5));return new Ej(h,P,[new Pi].concat(pa(a)))};try{var Kj,Lj,Mj=(Lj=(Kj=window)==null?void 0:Kj.top)!=null?Lj:w;Mj.U3bHHf!=null||(Mj.U3bHHf=0);Mj.U3bHHf++}catch(a){w.U3bHHf!=null||(w.U3bHHf=0),w.U3bHHf++};"#".replace(/([-()\[\]{}+?*.$\^|,:#2){var h=Array.prototype.slice.call(arguments,2);g=function(){e.apply(this,h)}}return d(g,f)};c[b][Uj(a,!1)]=d} +Sj.prototype.L=function(){var a=w.window||w.globalThis;var b=a.setTimeout;b=b[Uj(this,!1)]||b;a.setTimeout=b;b=a.setInterval;b=b[Uj(this,!1)]||b;a.setInterval=b;Sj.T.L.call(this)};function Xj(a){A.call(this,"Error in protected function: "+(a&&a.message?String(a.message):String(a)),a);(a=a&&a.stack)&&typeof a==="string"&&(this.stack=a)}y(Xj,A);function ak(){};var bk;function ck(){}y(ck,ak);ck.prototype.j=function(){return new XMLHttpRequest};bk=new ck;function dk(a){Z.call(this);this.headers=new Map;this.S=a||null;this.l=!1;this.g=null;this.M="";this.B=0;this.o=this.K=this.F=this.H=!1;this.N=0;this.v=null;this.O="";this.R=!1}y(dk,Z);var ek=/^https?$/i,fk=["POST","PUT"],gk=[];p=dk.prototype;p.Qa=function(){this.dispose();Ua(gk,this)}; +p.send=function(a,b,c,d){if(this.g)throw Error("[goog.net.XhrIo] Object is active with another request="+this.M+"; newUri="+a);b=b?b.toUpperCase():"GET";this.M=a;this.B=0;this.H=!1;this.l=!0;this.g=this.S?this.S.j():bk.j();this.g.onreadystatechange=Df(x(this.Ba,this));try{this.K=!0,this.g.open(b,String(a),!0),this.K=!1}catch(g){hk(this);return}a=c||"";c=new Map(this.headers);if(d)if(Object.getPrototypeOf(d)===Object.prototype)for(var e in d)c.set(e,d[e]);else if(typeof d.keys==="function"&&typeof d.get=== +"function"){e=v(d.keys());for(var f=e.next();!f.done;f=e.next())f=f.value,c.set(f,d.get(f))}else throw Error("Unknown input type for opt_headers: "+String(d));d=Array.from(c.keys()).find(function(g){return"content-type"==g.toLowerCase()});e=w.FormData&&a instanceof w.FormData;!(Sa(fk,b)>=0)||d||e||c.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8");b=v(c);for(d=b.next();!d.done;d=b.next())c=v(d.value),d=c.next().value,c=c.next().value,this.g.setRequestHeader(d,c);this.O&&(this.g.responseType= +this.O);"withCredentials"in this.g&&this.g.withCredentials!==this.R&&(this.g.withCredentials=this.R);try{this.v&&(clearTimeout(this.v),this.v=null),this.N>0&&(this.v=setTimeout(this.mb.bind(this),this.N)),this.F=!0,this.g.send(a),this.F=!1}catch(g){hk(this)}};p.mb=function(){typeof wa!="undefined"&&this.g&&(this.B=8,this.dispatchEvent("timeout"),this.abort(8))};function hk(a){a.l=!1;a.g&&(a.o=!0,a.g.abort(),a.o=!1);a.B=5;ik(a);jk(a)} +function ik(a){a.H||(a.H=!0,a.dispatchEvent("complete"),a.dispatchEvent("error"))}p.abort=function(a){this.g&&this.l&&(this.l=!1,this.o=!0,this.g.abort(),this.o=!1,this.B=a||7,this.dispatchEvent("complete"),this.dispatchEvent("abort"),jk(this))};p.L=function(){this.g&&(this.l&&(this.l=!1,this.o=!0,this.g.abort(),this.o=!1),jk(this,!0));dk.T.L.call(this)};p.Ba=function(){this.ka()||(this.K||this.F||this.o?kk(this):this.ta())};p.ta=function(){kk(this)}; +function kk(a){if(a.l&&typeof wa!="undefined")if(a.F&&(a.g?a.g.readyState:0)==4)setTimeout(a.Ba.bind(a),0);else if(a.dispatchEvent("readystatechange"),(a.g?a.g.readyState:0)==4){a.l=!1;try{Ei(a)?(a.dispatchEvent("complete"),a.dispatchEvent("success")):(a.B=6,ik(a))}finally{jk(a)}}}function jk(a,b){if(a.g){a.v&&(clearTimeout(a.v),a.v=null);var c=a.g;a.g=null;b||a.dispatchEvent("ready");try{c.onreadystatechange=null}catch(d){}}}p.isActive=function(){return!!this.g}; +function Ei(a){var b=Di(a);a:switch(b){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var c=!0;break a;default:c=!1}if(!c){if(b=b===0)a=String(a.M).match(sf)[1]||null,!a&&w.self&&w.self.location&&(a=w.self.location.protocol.slice(0,-1)),b=!ek.test(a?a.toLowerCase():"");c=b}return c}function Di(a){try{return(a.g?a.g.readyState:0)>2?a.g.status:-1}catch(b){return-1}}Jf(function(a){dk.prototype.ta=a(dk.prototype.ta)});function lk(a,b,c){Z.call(this);this.v=b||null;this.o={};this.B=mk;this.H=a;if(!c){this.g=null;this.g=new Sj(x(this.l,this));Zj(this.g,"setTimeout");Zj(this.g,"setInterval");a=this.g;b=w.window||w.globalThis;c=["requestAnimationFrame","mozRequestAnimationFrame","webkitAnimationFrame","msRequestAnimationFrame"];for(var d=0;d0;)f=" "+f;d.call(c,"[",f,"s] ");c.push("[",b.j(),"] ");c.push(b.getMessage());a.l&&(b=b.g(),b!==void 0&&c.push("\n",b instanceof +Error?b.message:String(b)));a.g&&c.push("\n");return c.join("")};function wk(a){a=a===void 0?new xk:a;Z.call(this);var b=this;this.O={};this.g=null;this.l={};this.M=new wi(this);this.Ra=a.v;this.R=a.K;this.Ha=a.F;this.Oa=a.D;this.Ia=a.M;var c=a.j;this.Fa=Jj({xa:a.H});this.Na=a.P;this.S=new Mh;var d=new dk;yk(this,c);this.F=new Fi(d,c,void 0,void 0,void 0);Cf(this,this.F);this.o=a.g?a.g:Ug(c,"docs-sup")+Ug(c,"docs-jepp")+"/jserror";if(d=Ug(c,"jobset"))this.o=yf(this.o,"jobset",d);if(d=Ug(c,"docs-ci"))this.o=yf(this.o,"id",d);d=Ug(c,"docs-pid");Qg(c.get("docs-eaotx"))&& +d&&(this.o=yf(this.o,"ouid",d));this.da=Tg(c,"docs-srmoe")||0;this.Ka=Qg(c.get("docs-oesf"));this.ea=Tg(c,"docs-srmour")||0;this.Ma=Qg(c.get("docs-oursf"));d=a.o||this.ea>0&&Math.random()0&&Math.random()0&&Math.random()< +e;c.get("docs-xduesf");e&&Xe();d&&(d=new Sj(function(g){var h={};h=(h.isUnhandledRejection="true",h);b.Ma?Bk(b,g,h):b.info(g,h)}),Yj(d),Cf(this,d));this.K=null;typeof document!=="undefined"&&document.body&&(this.K=Qj(function(g){var h={};h=(h.isWizError="true",h);g=v(g.data.errors);for(var k=g.next();!k.done;k=g.next())k=k.value.error,b.Ja?Bk(b,k,h):b.info(k,h)}));this.N=a.l;this.B=!1;this.H=!0;this.v=!1;this.ca=Ug(c,"docs-jern");this.Ga=a.B;this.Ea=a.J.concat(Object.values(Ue))}u(wk,Z); +function zk(a){var b=b===void 0?!1:b;if(Ck){if(Dk!=null)throw Error('ErrorReporter already installed. at "'+Dk.stack+'"');throw Error("ErrorReporter already installed.");}Ck=!0;Dk=Error();a.g=ok(a.o,function(e,f){return Ek(a,e,f)});var c={};a.Ha&&(c["X-No-Abort"]="1");a.g.F=c;pk(a.g,function(e,f,g,h){a.H&&a.F.send(e,f,g,h)});if(a.da>0&&Math.random()0){var d=new uk,e="";pf(function(g){e+=vk(d,g)});b.clientLog=e}c=b.severity||"fatal";this.Na||(c=Fj(this.Fa,a,c,b));this.ca&&(b.reportName=this.ca+"_"+c);b.isArrayPrototypeIntact=Ii().toString();if(!("WorkerGlobalScope"in w&&self instanceof w.WorkerGlobalScope)){try{var f=!!document.getElementById("docs-editor")}catch(g){f=!1}b.isEditorElementAttached=f.toString()}b.documentCharacterSet= +document.characterSet;b.origin=String(w.origin);f=a.stack||"";if(f.trim().length==0||f=="Not available")b["stacklessError-reportingStack"]=ef(wk.prototype.X),[a.message].concat(pa(Object.keys(b)),pa(Object.values(b))).some(function(g){return g&&g.includes("");this.B&&!this.N?(this.H=this.v,c=="fatal"?c="postmortem":c=="incident"&&(c="warningafterdeath")):c=="fatal"&&(this.B=!0);this.v=!1;b.severity=c}; +wk.prototype.L=function(){Ck=!1;if(this.K)for(var a=this.K,b=v(a.et),c=b.next();!c.done;c=b.next()){c=c.value;var d=Nj(a.el,c);if(d&&(Ua(d,a.Pa),!d.length)){d=a.el;var e=Ka(d.getAttribute("jsaction")||"");c+=":.CLIENT";e=e.replace(c+";","");e=e.replace(c,"");Rj(d,e)}}Bf(this.M,this.g,this.F);Z.prototype.L.call(this)};var Ck=!1,Dk=null;function xk(){this.K=this.j=void 0;this.D=this.M=this.v=!1;this.g=void 0;this.F=this.l=!1;this.B=!0;this.J=[];this.P=this.o=!1;this.H=[]} +function Fk(a,b){a instanceof Ke&&(a=a.g);gb(a,"severity",b)};function Kk(a){this.o=a.pb||null;this.l=a.oc||!1;this.g=void 0}y(Kk,ak);Kk.prototype.j=function(){var a=new Lk(this.o,this.l);this.g&&(a.F=this.g);return a};function Lk(a,b){Z.call(this);this.X=a;this.K=b;this.F=void 0;this.status=this.readyState=0;this.responseType=this.o=this.l=this.statusText="";this.onreadystatechange=null;this.N=new Headers;this.v=null;this.R="GET";this.S="";this.g=!1;this.O=this.B=this.H=null;this.M=new AbortController}y(Lk,Z);p=Lk.prototype; +p.open=function(a,b){if(this.readyState!=0)throw this.abort(),Error("Error reopening a connection");this.R=a;this.S=b;this.readyState=1;Mk(this)};p.send=function(a){if(this.readyState!=1)throw this.abort(),Error("need to call open() first. ");if(this.M.signal.aborted)throw this.abort(),Error("Request was aborted.");this.g=!0;var b={headers:this.N,method:this.R,credentials:this.F,cache:void 0,signal:this.M.signal};a&&(b.body=a);(this.X||w).fetch(new Request(this.S,b)).then(this.Ya.bind(this),this.ia.bind(this))}; +p.abort=function(){this.l=this.o="";this.N=new Headers;this.status=0;this.M.abort("Request was aborted.");this.B&&this.B.cancel("Request was aborted.").catch(n());this.readyState>=1&&this.g&&this.readyState!=4&&(this.g=!1,Nk(this));this.readyState=0}; +p.Ya=function(a){if(this.g&&(this.H=a,this.v||(this.status=this.H.status,this.statusText=this.H.statusText,this.v=a.headers,this.readyState=2,Mk(this)),this.g&&(this.readyState=3,Mk(this),this.g)))if(this.responseType==="arraybuffer")a.arrayBuffer().then(this.Wa.bind(this),this.ia.bind(this));else if(typeof w.ReadableStream!=="undefined"&&"body"in a){this.B=a.body.getReader();if(this.K){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.l= +[]}else this.l=this.o="",this.O=new TextDecoder;Ok(this)}else a.text().then(this.Xa.bind(this),this.ia.bind(this))};function Ok(a){a.B.read().then(a.Va.bind(a)).catch(a.ia.bind(a))}p.Va=function(a){if(this.g){if(this.K&&a.value)this.l.push(a.value);else if(!this.K){var b=a.value?a.value:new Uint8Array(0);if(b=this.O.decode(b,{stream:!a.done}))this.l=this.o+=b}a.done?Nk(this):Mk(this);this.readyState==3&&Ok(this)}};p.Xa=function(a){this.g&&(this.l=this.o=a,Nk(this))}; +p.Wa=function(a){this.g&&(this.l=a,Nk(this))};p.ia=function(){this.g&&Nk(this)};function Nk(a){a.readyState=4;a.H=null;a.B=null;a.O=null;Mk(a)}p.setRequestHeader=function(a,b){this.N.append(a,b)};p.getResponseHeader=function(a){return this.v?this.v.get(a.toLowerCase())||"":""};p.getAllResponseHeaders=function(){if(!this.v)return"";for(var a=[],b=this.v.entries(),c=b.next();!c.done;)c=c.value,a.push(c[0]+": "+c[1]),c=b.next();return a.join("\r\n")}; +function Mk(a){a.onreadystatechange&&a.onreadystatechange.call(a)}Object.defineProperty(Lk.prototype,"withCredentials",{get:function(){return this.F==="include"},set:function(a){this.F=a?"include":"same-origin"}});function Pk(a){this.g=null;this.j=a<1;this.l=a<.01}function Qk(a,b,c){c=c===void 0?{}:c;a.l&&(c.sampling_samplePercentage=(.01).toString(),a.g.info(b,c))}function Rk(a,b,c){c=c===void 0?{}:c;a.j&&(c.sampling_samplePercentage=(1).toString(),Hk(a.g,b,c))};function Sk(a){this.A=G(a)}u(Sk,J);Sk.prototype.getMessage=function(){return dd(this,1)};function Tk(a){this.A=G(a)}u(Tk,J);function Uk(a){this.A=G(a)}u(Uk,J);function Vk(a){this.A=G(a)}u(Vk,J);function Wk(a,b){return hd(a,b)}Vk.prototype.Aa=function(){return I(this,Tk,3)};Vk.prototype.pa=function(){return I(this,Sk,5)};function Xk(a){this.A=G(a)}u(Xk,J);function Yk(a){var b=new Xk;return hd(b,a)}Xk.prototype.pa=function(){return I(this,Sk,3)};Xk.prototype.Aa=function(){return I(this,Tk,4)};function Zk(a){var b=fg();chrome.runtime.sendMessage(zc(a),void 0,function(c){return $k(b,function(d){return new Xk(d)},c)});return b.promise.catch(function(c){c=df(c);gb(c,"offscreenDocumentRequestType",ed(a,1).toString());throw c;})} +function $k(a,b,c){var d=chrome.runtime;c!==void 0?(d=b(c),d.pa()?(b=a.reject,c=Error,d=d.pa(),d=fd(d,1),b.call(a,c("Error from Offscreen page:"+d))):a.resolve(d)):a.reject(Error("No response from Offscreen page:"+(d.lastError?d.lastError.message:"without lastError")))};function al(){return bl(chrome.storage.local,["optedInUserOuid"]).then(function(a){return a.optedInUserOuid||null})}function cl(a){return dl({offlineOptedIn:!0}).then(function(){if(a){var b={};return dl((b.optedInUserOuid=a,b))}})}function el(){return dl({offlineOptedIn:!1}).then(function(){return fl()})} +function gl(){return bl(chrome.storage.local,["offlineOptedIn"]).then(function(a){a=a.offlineOptedIn;switch(a){case void 0:return"unknown";case !0:return"opted_in";case !1:return"opted_out";default:throw Error("Cannot handle opt in value "+a);}})}function dg(){return bl(chrome.storage.managed,["allowedDocsOfflineDomains"]).then(function(a){return a&&a.allowedDocsOfflineDomains?a.allowedDocsOfflineDomains:[]})} +function eg(){return bl(chrome.storage.managed,["autoEnabledDocsOfflineDomains"]).then(function(a){return a&&a.autoEnabledDocsOfflineDomains?a.autoEnabledDocsOfflineDomains:[]})}function bl(a,b){return new X(function(c,d){a.get(b,function(e){chrome.runtime.lastError?d(Error(chrome.runtime.lastError)):c(e)})})}function dl(a){return new X(function(b,c){chrome.storage.local.set(a,function(){chrome.runtime.lastError?c(Error(chrome.runtime.lastError)):b()})})} +function fl(){return new X(function(a,b){chrome.storage.local.remove("optedInUserOuid",function(){chrome.runtime.lastError?b(Error(chrome.runtime.lastError)):a()})})}function hl(){return bl(chrome.storage.local,["lastSuccessfulFrameConnectTime"]).then(function(a){return a.lastSuccessfulFrameConnectTime||null})};function il(a){this.A=G(a)}u(il,J);function jl(a){this.A=G(a)}u(jl,J);function kl(a){this.A=G(a)}u(kl,J);function ll(a){this.A=G(a)}u(ll,J);function ml(a){this.A=G(a)}u(ml,J);function nl(a){this.A=G(a)}u(nl,J);function ol(a){var b=new nl;return hd(b,a)}function pl(a,b){return $c(a,ll,5,b)};function ql(a,b,c){W.call(this);this.v=null;this.H=a;this.B=b;this.o=c;this.j=fg();this.l=!1;a=new sh;vh(a,"offscreendocument.html");Gh(a,"randomPercentageForSampling",this.o);Gh(a,"sessionId",this.B);this.F={url:a.toString(),reasons:["IFRAME_SCRIPTING"],justification:"Use iframe to access user data under docs.google.com domain"};this.g=new Pk(this.o)}u(ql,W);function rl(a,b){a.v=b} +function sl(a){return tl().then(function(b){return b?Zk(ol(5)).then(function(){return chrome.offscreen.closeDocument()}):Promise.resolve()}).then(function(){ul(a)})}function vl(a,b){return wl(xl(a,yl(a,6,b)))}function zl(a,b){b=yl(a,1,b);return wl(xl(a,b))}function Al(a,b){return tl().then(function(c){b[Bl(0)]=c.toString();return c?Promise.resolve():Cl(a)})} +function Cl(a){return chrome.offscreen.createDocument(a.F).catch(function(b){if(b instanceof Error&&b.message.includes("Only a single offscreen document may be created"))Qk(a.g,b);else return Promise.reject(b)})}function Dl(a,b){return chrome.offscreen.closeDocument().catch(function(c){c=c instanceof Error?c.message:c.toString();Qk(a.g,Error(c),b);b.errorWhenForceCloseOffscreenDoc=c}).then(function(){return Cl(a)})} +function yl(a,b,c){b=ol(b);var d=new il;c=gd(d,1,c);c=gd(c,2,a.v.toString());a=gd(c,3,a.H);a=gd(a,4,"opted_in");return $c(b,il,2,a)} +function El(a,b){var c={sendingFrameRequestType:ed(b,1)},d=pl(ol(4),b);return wl(Fl(a,d,c,0)).catch(function(e){if(e instanceof Error){c.offlineFrameConnected_afterFirstError=a.l;if(Gl(e.message))return Qk(a.g,e,c),new Promise(function(f){return setTimeout(function(){return f(Fl(a,d,c,1))},2E3)});if("Requests cancelled because user has been opted out"==e.message)return Promise.resolve(new Tk)}return Promise.reject(e instanceof Error?e:Error(e))})} +function Fl(a,b,c,d){return a.j.promise.then(function(){return tl()}).then(function(e){c[Bl(d)]=e.toString();return e?Zf():Hl(a)}).then(function(){return a.j.promise}).then(function(){return Zk(b)}).then(function(e){return e.Aa()}).V(function(e){return Il(e,c)})}function Hl(a){ul(a);return gl().then(function(b){return b=="opted_in"?al().then(function(c){return zl(a,c)}):$f()})} +function xl(a,b){ed(b,1)==6||ed(b,1);var c={sendingOffscreenDocumentRequestType:ed(b,1).toString()};return Zf(Al(a,c)).then(function(){return ri()}).then(function(){return Zk(b)}).V(function(d){return d instanceof Error&&Gl(d.message)?(Qk(a.g,d,c),Zf(tl()).then(function(e){c[Bl(1)]=e.toString()}).then(function(){return Dl(a,c)}).then(function(){return ri()}).then(function(){return Zk(b)})):Promise.reject(d instanceof Error?d:Error(d))}).V(function(d){return Il(d,c)})} +function Gl(a){return a.includes("Could not establish connection. Receiving end does not exist.")||a.includes("The message port closed before a response was received.")||a.includes("A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received")}function tl(){return self.clients.matchAll().then(function(a){return a.some(function(b){return b.url.includes(chrome.runtime.getURL("offscreendocument.html"))})})} +ql.prototype.L=function(){sl(this);W.prototype.L.call(this)};function wl(a){return Promise.resolve(a)}function ul(a){a.j=fg();a.l=!1}function Bl(a){switch(a){case 0:return"hasDocument_beforeCreatingOffscreenDoc_0";case 1:return"hasDocument_beforeCreatingOffscreenDoc_1";default:throw Error("Cannot get error context key with retryAttempt "+a);}} +function Il(a,b){a=df(a);b=v(Object.entries(b));for(var c=b.next();!c.done;c=b.next()){var d=v(c.value);c=d.next().value;d=d.next().value;gb(a,c,d)}throw a;};function Jl(a){this.A=G(a)}u(Jl,J);function Kl(a){this.A=G(a)}u(Kl,J);function Ll(a){this.A=G(a)}u(Ll,J);function Ml(){x(this.l,this);this.g=new uk;this.g.j=!1;this.g.l=!1;this.j=this.g.g=!1;this.o={}}function Nl(a){1!=a.j&&(a.j=!0)}Ml.prototype.l=function(a){function b(f){if(f){if(f.value>=kf.value)return"error";if(f.value>=lf.value)return"warn";if(f.value>=mf.value)return"log"}return"debug"}if(!this.o[a.j()]){var c=vk(this.g,a),d=Ol;if(d){var e=b(a.o());Pl(d,e,c,a.g())}}};var Ol=w.console;function Pl(a,b,c,d){if(a[b])a[b](c,d===void 0?"":d);else a.log(c,d===void 0?"":d)};var Ql=new Kk({pb:self});Ql.g="same-origin";bk=Ql; +function Rl(){W.call(this);var a=this;this.F=Ne();this.g=this.v=null;this.M=!1;this.P=new Ml;Nl(this.P);this.K=fg();chrome.alarms.onAlarm.addListener(function(b){return a.K.promise.then(function(){return Jk(a.g,Ik(a.g,a.eb,a)(b))})});chrome.runtime.onMessageExternal.addListener(function(b,c,d){return Sl(a,b,d)});chrome.runtime.onMessage.addListener(this.fb.bind(this));this.B=new wi(this);Cf(this,this.B);this.B.listen(w,"message",this.gb);this.o=Math.random()*100;this.H=this.o<1;this.l=new Pk(this.o); +this.j=new ql(Tl(),this.F,this.o);chrome.runtime.onConnectExternal.addListener(n());qi(this.kb,252E5,this)}u(Rl,W);p=Rl.prototype;p.load=function(){var a=this;this.v="docs.google.com";return dl({docsDomain:this.v}).then(function(){a.g=Ul(a);a.K.resolve();Cf(a,a.g);a.l.g=a.g;a.j.g.g=a.g;rl(a.j,Vl(a));Cf(a,a.j);var b=Ik(a.g,a.ab,a),c=Jk(a.g,Zf().then(function(){return b()}));return Zf(c)}).V(function(b){df(b)})}; +function Wl(a,b,c){return Gh(Gh(vh(Vl(a),"/offline/extension/report"),"v",c),"optin",b).toString()}p.kb=function(){chrome.alarms.create("open",{delayInMinutes:1});Qk(this.l,Error("Called unsafeClose_"))};function Xl(a,b){b=b===void 0?!1:b;return new X(function(c){chrome.alarms.get("heartbeat",function(d){d||chrome.alarms.create("heartbeat",{periodInMinutes:5});d&&!b||Yl(a,"heartbeat");c()})})}function Zl(){return new X(function(a){chrome.alarms.clear("heartbeat",function(){a()})})} +p.ab=function(){var a=this;return hl().then(function(b){a.g.l.lastSuccessfulFrameConnectTime=(b==null?void 0:b.toString())||"null"}).then(function(){return gl()}).then(function(b){var c=Tl();a.g.l.extensionVersion=c;a.g.l.optInStatus=String(b);$l(a,String(b),c);switch(b){case "unknown":break;case "opted_in":return al().then(function(d){return zl(a.j,d)});case "opted_out":break;default:throw Error("Could not handle opt in status "+b);}})}; +function $l(a,b,c){a.H&&(b=Wl(a,b,c),w.fetch(new Request(b,{method:"post",mode:"cors"})).then(n()).catch(function(d){Hk(a.g,df(d))}))}p.gb=function(a){var b=a.g;b&&b.data&&b.ports&&b.ports.length?(a=new Ll(b.data),am(this,a,b.ports.length>1?b.ports[1]:void 0).then(function(c){b.ports[0].postMessage(zc(c))})):Rk(this.l,Error("Dropped invalid event."),{event:String(a)})}; +function Sl(a,b,c){var d=new Ll(b);am(a,d).then(function(e){c(zc(e))}).V(function(e){if(e instanceof Error&&e.message=="Attempting to use a disconnected port object")Rk(a.l,Error("Failed to reply to request because listen port was disconnected."),{requestType:hc(H(d,1,void 0,Lc))});else throw e;});return!0} +p.fb=function(a,b,c){var d=this;a=new nl(a);switch(hc(H(a,1,void 0,Lc))){case 3:var e=I(a,jl,4);a=oc(H(e,1))!=null?dd(e,1):null;var f=fd(e,2);cl(a).then(function(){return dl({lastSuccessfulFrameConnectTime:parseInt(f,10)})}).then(function(){var h=d.j;h.l=!0;h.j.resolve()}).then(function(){var h=Yk(3);c(zc(h))});break;case 7:var g=Yk(7);(a=(e=I(a,ml,6))==null?void 0:dd(e,1))?bm(this,a).then(function(){return c(zc(g))}):cm(this).then(function(){return c(zc(g))});break;default:throw Error("Unsupported OffscreenDocumentRequestType."); +}return!0};function am(a,b,c){return Zf().then(a.hb.bind(a,b,c)).V(function(d){d=d instanceof Error?d:Error(d);var e=new Vk,f=new Sk;$c(e,Sk,5,f);gd(f,1,d.message);return e})} +p.hb=function(a){var b=this,c=Wk(new Vk,hc(H(a,1)));switch(hc(H(a,1,void 0,Lc))){case 1:return(a=(a=I(a,jl,7))?fd(a,1):null)||Qk(this.l,Error("Scheduler frame connect request sent without an ouid.")),cl(a).then(function(){return dl({lastSuccessfulFrameConnectTime:Date.now()})}).then(function(){var f=b.j;f.l=!0;f.j.resolve()}).then(function(){return c});case 2:var d=(a=I(a,Jl,8))?fd(a,1):null,e=a?!!ad(a,2):!1;return cl(d).then(function(){return d?d:al()}).then(function(f){return vl(b.j,f).then(function(){return Xl(b, +e)})}).then(function(){return c});case 3:return(a=I(a,ml,3))&&dd(a,1)?(a=dd(a,1),bm(this,a).then(function(){return c})):cm(this).then(function(){return c});case 5:return dm(I(a,Kl,5)).then(function(f){$c(c,Uk,4,f);return c});case 4:return a=I(a,ll,4),Zf(El(this.j,a)).then(function(f){$c(c,Tk,3,f);return c})}throw Error("Dropped unknown message "+a);}; +function dm(a){var b=fd(a,1);return cg().then(function(c){var d=c[0],e=c[1];c=new Uk;e=Sa(e,b)>=0;d=Sa(d,b)>=0||e;d=d==null?d:dc(d);Nc(c,1,d);Nc(c,2,e==null?e:dc(e));return c})}function bm(a,b){return a.M?Zf(sl(a.j)):(Qk(a.l,Error("Extension frame connected with the wrong OUID.")),a.M=!0,Zf(zl(a.j,b)))}function cm(a){return el().then(function(){return Zl()}).then(function(){return sl(a.j)})}p.eb=function(a){return Yl(this,a.name)}; +function Yl(a,b){var c=new ll;c=hd(c,0);var d=new kl;b=gd(d,1,b);$c(c,kl,2,b);return Zf(El(a.j,c))}function Ul(a){var b=vh(Vl(a),"/offline/jserror").toString(),c=a.H;a=String(a.F);var d=!0;d=d===void 0?!1:d;var e=e===void 0?Ng():e;var f=new xk;f.v=!1;f.D=!0;f.g=b;f.l=d;f.j=e;f.o=!1;b=new wk(f);b.l.sessionTypeName="offline-event-page";b.l.reportsNonFatalErrors=String(c);b.l.sid=a;return b}function Vl(a){return th(new sh("//"+a.v),"https")} +function Tl(){var a=chrome.runtime.getManifest();return a.version?a.version:"unknown"};self.window=self;(new Rl).load(); diff --git a/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/CURRENT b/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/CURRENT +++ b/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/LOG b/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/LOG index 39adb67..e350283 100644 --- a/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/LOG +++ b/.edge-profile-render-1774484525680/Default/Local Extension Settings/jdiccldimpdaibmpdkjnbmckianbfold/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:07.509 4f88 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Local Extension Settings\jdiccldimpdaibmpdkjnbmckianbfold since it was missing. -2026/03/25-19:22:07.515 4f88 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Local Extension Settings\jdiccldimpdaibmpdkjnbmckianbfold/MANIFEST-000001 +2026/03/25-19:22:07.509 4f88 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Local Extension Settings\jdiccldimpdaibmpdkjnbmckianbfold since it was missing. +2026/03/25-19:22:07.515 4f88 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Local Extension Settings\jdiccldimpdaibmpdkjnbmckianbfold/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/CURRENT b/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/CURRENT +++ b/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/LOG b/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/LOG index dc2f342..23612f9 100644 --- a/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/LOG +++ b/.edge-profile-render-1774484525680/Default/Local Storage/leveldb/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:06.673 4734 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Local Storage\leveldb since it was missing. -2026/03/25-19:22:06.716 4734 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Local Storage\leveldb/MANIFEST-000001 +2026/03/25-19:22:06.673 4734 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Local Storage\leveldb since it was missing. +2026/03/25-19:22:06.716 4734 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Local Storage\leveldb/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Session Storage/CURRENT b/.edge-profile-render-1774484525680/Default/Session Storage/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/Session Storage/CURRENT +++ b/.edge-profile-render-1774484525680/Default/Session Storage/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Session Storage/LOG b/.edge-profile-render-1774484525680/Default/Session Storage/LOG index 2f8baeb..51ed497 100644 --- a/.edge-profile-render-1774484525680/Default/Session Storage/LOG +++ b/.edge-profile-render-1774484525680/Default/Session Storage/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:06.925 4734 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Session Storage since it was missing. -2026/03/25-19:22:06.947 4734 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Session Storage/MANIFEST-000001 +2026/03/25-19:22:06.925 4734 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Session Storage since it was missing. +2026/03/25-19:22:06.947 4734 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Session Storage/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Site Characteristics Database/CURRENT b/.edge-profile-render-1774484525680/Default/Site Characteristics Database/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/Site Characteristics Database/CURRENT +++ b/.edge-profile-render-1774484525680/Default/Site Characteristics Database/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Site Characteristics Database/LOG b/.edge-profile-render-1774484525680/Default/Site Characteristics Database/LOG index a246b22..00698ad 100644 --- a/.edge-profile-render-1774484525680/Default/Site Characteristics Database/LOG +++ b/.edge-profile-render-1774484525680/Default/Site Characteristics Database/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:06.443 54ac Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Site Characteristics Database since it was missing. -2026/03/25-19:22:06.456 54ac Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Site Characteristics Database/MANIFEST-000001 +2026/03/25-19:22:06.443 54ac Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Site Characteristics Database since it was missing. +2026/03/25-19:22:06.456 54ac Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Site Characteristics Database/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/CURRENT b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/CURRENT +++ b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/LOG b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/LOG index a6a3b68..a9a6600 100644 --- a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/LOG +++ b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Local Storage/leveldb/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:07.014 4734 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Local Storage\leveldb since it was missing. -2026/03/25-19:22:07.040 4734 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Local Storage\leveldb/MANIFEST-000001 +2026/03/25-19:22:07.014 4734 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Local Storage\leveldb since it was missing. +2026/03/25-19:22:07.040 4734 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Local Storage\leveldb/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/CURRENT b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/CURRENT +++ b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/LOG b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/LOG index 2f6feaa..e5fb64c 100644 --- a/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/LOG +++ b/.edge-profile-render-1774484525680/Default/Storage/ext/ihmafllikibpmigkcoadcmckbfhibefp/def/Session Storage/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:22.521 4734 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Session Storage since it was missing. -2026/03/25-19:22:22.568 4734 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Session Storage/MANIFEST-000001 +2026/03/25-19:22:22.521 4734 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Session Storage since it was missing. +2026/03/25-19:22:22.568 4734 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Storage\ext\ihmafllikibpmigkcoadcmckbfhibefp\def\Session Storage/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/CURRENT +++ b/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/LOG b/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/LOG index cf19fd1..25ba594 100644 --- a/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/LOG +++ b/.edge-profile-render-1774484525680/Default/Sync Data/LevelDB/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:06.423 4f88 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Sync Data\LevelDB since it was missing. -2026/03/25-19:22:06.450 4f88 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Sync Data\LevelDB/MANIFEST-000001 +2026/03/25-19:22:06.423 4f88 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Sync Data\LevelDB since it was missing. +2026/03/25-19:22:06.450 4f88 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\Sync Data\LevelDB/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/CURRENT b/.edge-profile-render-1774484525680/Default/shared_proto_db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/shared_proto_db/CURRENT +++ b/.edge-profile-render-1774484525680/Default/shared_proto_db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/LOG b/.edge-profile-render-1774484525680/Default/shared_proto_db/LOG index 86e12d0..c81e2c0 100644 --- a/.edge-profile-render-1774484525680/Default/shared_proto_db/LOG +++ b/.edge-profile-render-1774484525680/Default/shared_proto_db/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:06.981 4f88 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\shared_proto_db since it was missing. -2026/03/25-19:22:06.989 4f88 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\shared_proto_db/MANIFEST-000001 +2026/03/25-19:22:06.981 4f88 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\shared_proto_db since it was missing. +2026/03/25-19:22:06.989 4f88 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\shared_proto_db/MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/CURRENT +++ b/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/LOG b/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/LOG index 22db708..0454473 100644 --- a/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/LOG +++ b/.edge-profile-render-1774484525680/Default/shared_proto_db/metadata/LOG @@ -1,2 +1,2 @@ -2026/03/25-19:22:06.969 4f88 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\shared_proto_db\metadata since it was missing. -2026/03/25-19:22:06.977 4f88 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\shared_proto_db\metadata/MANIFEST-000001 +2026/03/25-19:22:06.969 4f88 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\shared_proto_db\metadata since it was missing. +2026/03/25-19:22:06.977 4f88 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render-1774484525680\Default\shared_proto_db\metadata/MANIFEST-000001 diff --git a/.edge-profile-render/Crashpad/throttle_store.dat b/.edge-profile-render/Crashpad/throttle_store.dat index 9639e1b..53a4e73 100644 --- a/.edge-profile-render/Crashpad/throttle_store.dat +++ b/.edge-profile-render/Crashpad/throttle_store.dat @@ -1 +1 @@ -level=none expiry=0 +level=none expiry=0 diff --git a/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/CURRENT b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/CURRENT +++ b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG index c0b2813..5527e6e 100644 --- a/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG +++ b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG @@ -1,3 +1,3 @@ -2026/03/25-16:31:36.847 880 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\EdgeCoupons/coupons_data.db/MANIFEST-000001 -2026/03/25-16:31:36.850 880 Recovering log #3 -2026/03/25-16:31:36.852 880 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\EdgeCoupons/coupons_data.db/000003.log +2026/03/25-16:31:36.847 880 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\EdgeCoupons/coupons_data.db/MANIFEST-000001 +2026/03/25-16:31:36.850 880 Recovering log #3 +2026/03/25-16:31:36.852 880 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\EdgeCoupons/coupons_data.db/000003.log diff --git a/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG.old b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG.old index c21b242..ff2b317 100644 --- a/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG.old +++ b/.edge-profile-render/Default/EdgeCoupons/coupons_data.db/LOG.old @@ -1,2 +1,2 @@ -2026/03/25-16:31:00.247 4854 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\EdgeCoupons/coupons_data.db since it was missing. -2026/03/25-16:31:00.262 4854 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\EdgeCoupons/coupons_data.db/MANIFEST-000001 +2026/03/25-16:31:00.247 4854 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\EdgeCoupons/coupons_data.db since it was missing. +2026/03/25-16:31:00.262 4854 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\EdgeCoupons/coupons_data.db/MANIFEST-000001 diff --git a/.edge-profile-render/Default/Extension Rules/CURRENT b/.edge-profile-render/Default/Extension Rules/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render/Default/Extension Rules/CURRENT +++ b/.edge-profile-render/Default/Extension Rules/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render/Default/Extension Rules/LOG b/.edge-profile-render/Default/Extension Rules/LOG index a9de9ed..8d86ce3 100644 --- a/.edge-profile-render/Default/Extension Rules/LOG +++ b/.edge-profile-render/Default/Extension Rules/LOG @@ -1,3 +1,3 @@ -2026/03/25-16:31:30.316 28d0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Rules/MANIFEST-000001 -2026/03/25-16:31:30.321 28d0 Recovering log #3 -2026/03/25-16:31:30.324 28d0 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Rules/000003.log +2026/03/25-16:31:30.316 28d0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Rules/MANIFEST-000001 +2026/03/25-16:31:30.321 28d0 Recovering log #3 +2026/03/25-16:31:30.324 28d0 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Rules/000003.log diff --git a/.edge-profile-render/Default/Extension Rules/LOG.old b/.edge-profile-render/Default/Extension Rules/LOG.old index d1bddbf..57be32b 100644 --- a/.edge-profile-render/Default/Extension Rules/LOG.old +++ b/.edge-profile-render/Default/Extension Rules/LOG.old @@ -1,2 +1,2 @@ -2026/03/25-16:30:54.102 32e8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Rules since it was missing. -2026/03/25-16:30:54.126 32e8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Rules/MANIFEST-000001 +2026/03/25-16:30:54.102 32e8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Rules since it was missing. +2026/03/25-16:30:54.126 32e8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Rules/MANIFEST-000001 diff --git a/.edge-profile-render/Default/Extension Scripts/CURRENT b/.edge-profile-render/Default/Extension Scripts/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render/Default/Extension Scripts/CURRENT +++ b/.edge-profile-render/Default/Extension Scripts/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render/Default/Extension Scripts/LOG b/.edge-profile-render/Default/Extension Scripts/LOG index ea1d3de..d69094e 100644 --- a/.edge-profile-render/Default/Extension Scripts/LOG +++ b/.edge-profile-render/Default/Extension Scripts/LOG @@ -1,3 +1,3 @@ -2026/03/25-16:31:30.341 28d0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Scripts/MANIFEST-000001 -2026/03/25-16:31:30.346 28d0 Recovering log #3 -2026/03/25-16:31:30.350 28d0 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Scripts/000003.log +2026/03/25-16:31:30.341 28d0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Scripts/MANIFEST-000001 +2026/03/25-16:31:30.346 28d0 Recovering log #3 +2026/03/25-16:31:30.350 28d0 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Scripts/000003.log diff --git a/.edge-profile-render/Default/Extension Scripts/LOG.old b/.edge-profile-render/Default/Extension Scripts/LOG.old index 92fedf0..a88e424 100644 --- a/.edge-profile-render/Default/Extension Scripts/LOG.old +++ b/.edge-profile-render/Default/Extension Scripts/LOG.old @@ -1,2 +1,2 @@ -2026/03/25-16:30:54.141 32e8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Scripts since it was missing. -2026/03/25-16:30:54.164 32e8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Scripts/MANIFEST-000001 +2026/03/25-16:30:54.141 32e8 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Scripts since it was missing. +2026/03/25-16:30:54.164 32e8 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension Scripts/MANIFEST-000001 diff --git a/.edge-profile-render/Default/Extension State/CURRENT b/.edge-profile-render/Default/Extension State/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render/Default/Extension State/CURRENT +++ b/.edge-profile-render/Default/Extension State/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render/Default/Extension State/LOG b/.edge-profile-render/Default/Extension State/LOG index e613e62..691302d 100644 --- a/.edge-profile-render/Default/Extension State/LOG +++ b/.edge-profile-render/Default/Extension State/LOG @@ -1,3 +1,3 @@ -2026/03/25-16:32:08.734 55ac Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension State/MANIFEST-000001 -2026/03/25-16:32:08.738 55ac Recovering log #3 -2026/03/25-16:32:08.740 55ac Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension State/000003.log +2026/03/25-16:32:08.734 55ac Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension State/MANIFEST-000001 +2026/03/25-16:32:08.738 55ac Recovering log #3 +2026/03/25-16:32:08.740 55ac Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension State/000003.log diff --git a/.edge-profile-render/Default/Extension State/LOG.old b/.edge-profile-render/Default/Extension State/LOG.old index 772af4d..aabbf0c 100644 --- a/.edge-profile-render/Default/Extension State/LOG.old +++ b/.edge-profile-render/Default/Extension State/LOG.old @@ -1,3 +1,3 @@ -2026/03/25-16:31:32.090 1fa4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension State/MANIFEST-000001 -2026/03/25-16:31:32.095 1fa4 Recovering log #3 -2026/03/25-16:31:32.097 1fa4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension State/000003.log +2026/03/25-16:31:32.090 1fa4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension State/MANIFEST-000001 +2026/03/25-16:31:32.095 1fa4 Recovering log #3 +2026/03/25-16:31:32.097 1fa4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Extension State/000003.log diff --git a/.edge-profile-render/Default/Site Characteristics Database/CURRENT b/.edge-profile-render/Default/Site Characteristics Database/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render/Default/Site Characteristics Database/CURRENT +++ b/.edge-profile-render/Default/Site Characteristics Database/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render/Default/Site Characteristics Database/LOG b/.edge-profile-render/Default/Site Characteristics Database/LOG index fd1b0ed..1aa91d8 100644 --- a/.edge-profile-render/Default/Site Characteristics Database/LOG +++ b/.edge-profile-render/Default/Site Characteristics Database/LOG @@ -1,3 +1,3 @@ -2026/03/25-16:32:06.995 160c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Site Characteristics Database/MANIFEST-000001 -2026/03/25-16:32:06.998 160c Recovering log #3 -2026/03/25-16:32:07.000 160c Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Site Characteristics Database/000003.log +2026/03/25-16:32:06.995 160c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Site Characteristics Database/MANIFEST-000001 +2026/03/25-16:32:06.998 160c Recovering log #3 +2026/03/25-16:32:07.000 160c Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Site Characteristics Database/000003.log diff --git a/.edge-profile-render/Default/Site Characteristics Database/LOG.old b/.edge-profile-render/Default/Site Characteristics Database/LOG.old index 1d8cc17..74b5c60 100644 --- a/.edge-profile-render/Default/Site Characteristics Database/LOG.old +++ b/.edge-profile-render/Default/Site Characteristics Database/LOG.old @@ -1,3 +1,3 @@ -2026/03/25-16:31:30.064 2ba4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Site Characteristics Database/MANIFEST-000001 -2026/03/25-16:31:30.066 2ba4 Recovering log #3 -2026/03/25-16:31:30.068 2ba4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Site Characteristics Database/000003.log +2026/03/25-16:31:30.064 2ba4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Site Characteristics Database/MANIFEST-000001 +2026/03/25-16:31:30.066 2ba4 Recovering log #3 +2026/03/25-16:31:30.068 2ba4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Site Characteristics Database/000003.log diff --git a/.edge-profile-render/Default/Sync Data/LevelDB/CURRENT b/.edge-profile-render/Default/Sync Data/LevelDB/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render/Default/Sync Data/LevelDB/CURRENT +++ b/.edge-profile-render/Default/Sync Data/LevelDB/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render/Default/Sync Data/LevelDB/LOG b/.edge-profile-render/Default/Sync Data/LevelDB/LOG index 158effd..a8b74a7 100644 --- a/.edge-profile-render/Default/Sync Data/LevelDB/LOG +++ b/.edge-profile-render/Default/Sync Data/LevelDB/LOG @@ -1,3 +1,3 @@ -2026/03/25-16:32:06.970 22f4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Sync Data\LevelDB/MANIFEST-000001 -2026/03/25-16:32:06.983 22f4 Recovering log #3 -2026/03/25-16:32:06.985 22f4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Sync Data\LevelDB/000003.log +2026/03/25-16:32:06.970 22f4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Sync Data\LevelDB/MANIFEST-000001 +2026/03/25-16:32:06.983 22f4 Recovering log #3 +2026/03/25-16:32:06.985 22f4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Sync Data\LevelDB/000003.log diff --git a/.edge-profile-render/Default/Sync Data/LevelDB/LOG.old b/.edge-profile-render/Default/Sync Data/LevelDB/LOG.old index 6ddc82b..9042dc3 100644 --- a/.edge-profile-render/Default/Sync Data/LevelDB/LOG.old +++ b/.edge-profile-render/Default/Sync Data/LevelDB/LOG.old @@ -1,3 +1,3 @@ -2026/03/25-16:31:30.037 28d0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Sync Data\LevelDB/MANIFEST-000001 -2026/03/25-16:31:30.051 28d0 Recovering log #3 -2026/03/25-16:31:30.053 28d0 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Sync Data\LevelDB/000003.log +2026/03/25-16:31:30.037 28d0 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Sync Data\LevelDB/MANIFEST-000001 +2026/03/25-16:31:30.051 28d0 Recovering log #3 +2026/03/25-16:31:30.053 28d0 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\Sync Data\LevelDB/000003.log diff --git a/.edge-profile-render/Default/shared_proto_db/CURRENT b/.edge-profile-render/Default/shared_proto_db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render/Default/shared_proto_db/CURRENT +++ b/.edge-profile-render/Default/shared_proto_db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render/Default/shared_proto_db/LOG b/.edge-profile-render/Default/shared_proto_db/LOG index ac8146e..6a40153 100644 --- a/.edge-profile-render/Default/shared_proto_db/LOG +++ b/.edge-profile-render/Default/shared_proto_db/LOG @@ -1,3 +1,3 @@ -2026/03/25-16:32:08.665 22f4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db/MANIFEST-000001 -2026/03/25-16:32:08.672 22f4 Recovering log #3 -2026/03/25-16:32:08.674 22f4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db/000003.log +2026/03/25-16:32:08.665 22f4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db/MANIFEST-000001 +2026/03/25-16:32:08.672 22f4 Recovering log #3 +2026/03/25-16:32:08.674 22f4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db/000003.log diff --git a/.edge-profile-render/Default/shared_proto_db/LOG.old b/.edge-profile-render/Default/shared_proto_db/LOG.old index a87dca6..cfde92e 100644 --- a/.edge-profile-render/Default/shared_proto_db/LOG.old +++ b/.edge-profile-render/Default/shared_proto_db/LOG.old @@ -1,3 +1,3 @@ -2026/03/25-16:31:31.761 1fa4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db/MANIFEST-000001 -2026/03/25-16:31:31.765 1fa4 Recovering log #3 -2026/03/25-16:31:31.773 1fa4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db/000003.log +2026/03/25-16:31:31.761 1fa4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db/MANIFEST-000001 +2026/03/25-16:31:31.765 1fa4 Recovering log #3 +2026/03/25-16:31:31.773 1fa4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db/000003.log diff --git a/.edge-profile-render/Default/shared_proto_db/metadata/CURRENT b/.edge-profile-render/Default/shared_proto_db/metadata/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile-render/Default/shared_proto_db/metadata/CURRENT +++ b/.edge-profile-render/Default/shared_proto_db/metadata/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile-render/Default/shared_proto_db/metadata/LOG b/.edge-profile-render/Default/shared_proto_db/metadata/LOG index 5565380..f78c127 100644 --- a/.edge-profile-render/Default/shared_proto_db/metadata/LOG +++ b/.edge-profile-render/Default/shared_proto_db/metadata/LOG @@ -1,3 +1,3 @@ -2026/03/25-16:32:08.619 22f4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db\metadata/MANIFEST-000001 -2026/03/25-16:32:08.635 22f4 Recovering log #3 -2026/03/25-16:32:08.638 22f4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db\metadata/000003.log +2026/03/25-16:32:08.619 22f4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db\metadata/MANIFEST-000001 +2026/03/25-16:32:08.635 22f4 Recovering log #3 +2026/03/25-16:32:08.638 22f4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db\metadata/000003.log diff --git a/.edge-profile-render/Default/shared_proto_db/metadata/LOG.old b/.edge-profile-render/Default/shared_proto_db/metadata/LOG.old index ca4e84c..6efe882 100644 --- a/.edge-profile-render/Default/shared_proto_db/metadata/LOG.old +++ b/.edge-profile-render/Default/shared_proto_db/metadata/LOG.old @@ -1,3 +1,3 @@ -2026/03/25-16:31:31.738 1fa4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db\metadata/MANIFEST-000001 -2026/03/25-16:31:31.742 1fa4 Recovering log #3 -2026/03/25-16:31:31.744 1fa4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db\metadata/000003.log +2026/03/25-16:31:31.738 1fa4 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db\metadata/MANIFEST-000001 +2026/03/25-16:31:31.742 1fa4 Recovering log #3 +2026/03/25-16:31:31.744 1fa4 Reusing old log C:\Users\User\Documents\greenlens\Greenlens\.edge-profile-render\Default\shared_proto_db\metadata/000003.log diff --git a/.edge-profile/Crashpad/throttle_store.dat b/.edge-profile/Crashpad/throttle_store.dat index 9639e1b..53a4e73 100644 --- a/.edge-profile/Crashpad/throttle_store.dat +++ b/.edge-profile/Crashpad/throttle_store.dat @@ -1 +1 @@ -level=none expiry=0 +level=none expiry=0 diff --git a/.edge-profile/Default/Extension Rules/CURRENT b/.edge-profile/Default/Extension Rules/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile/Default/Extension Rules/CURRENT +++ b/.edge-profile/Default/Extension Rules/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile/Default/Extension Rules/LOG b/.edge-profile/Default/Extension Rules/LOG index b39b57e..e1a8ad0 100644 --- a/.edge-profile/Default/Extension Rules/LOG +++ b/.edge-profile/Default/Extension Rules/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:23:18.506 2f44 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension Rules since it was missing. -2026/03/25-16:23:18.523 2f44 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension Rules/MANIFEST-000001 +2026/03/25-16:23:18.506 2f44 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension Rules since it was missing. +2026/03/25-16:23:18.523 2f44 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension Rules/MANIFEST-000001 diff --git a/.edge-profile/Default/Extension Scripts/CURRENT b/.edge-profile/Default/Extension Scripts/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile/Default/Extension Scripts/CURRENT +++ b/.edge-profile/Default/Extension Scripts/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile/Default/Extension Scripts/LOG b/.edge-profile/Default/Extension Scripts/LOG index 4dd00a2..317c87e 100644 --- a/.edge-profile/Default/Extension Scripts/LOG +++ b/.edge-profile/Default/Extension Scripts/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:23:18.537 2f44 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension Scripts since it was missing. -2026/03/25-16:23:18.560 2f44 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension Scripts/MANIFEST-000001 +2026/03/25-16:23:18.537 2f44 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension Scripts since it was missing. +2026/03/25-16:23:18.560 2f44 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension Scripts/MANIFEST-000001 diff --git a/.edge-profile/Default/Extension State/CURRENT b/.edge-profile/Default/Extension State/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile/Default/Extension State/CURRENT +++ b/.edge-profile/Default/Extension State/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile/Default/Extension State/LOG b/.edge-profile/Default/Extension State/LOG index 91794ea..13e7abf 100644 --- a/.edge-profile/Default/Extension State/LOG +++ b/.edge-profile/Default/Extension State/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:23:20.248 5924 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension State since it was missing. -2026/03/25-16:23:20.263 5924 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension State/MANIFEST-000001 +2026/03/25-16:23:20.248 5924 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension State since it was missing. +2026/03/25-16:23:20.263 5924 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Extension State/MANIFEST-000001 diff --git a/.edge-profile/Default/Site Characteristics Database/CURRENT b/.edge-profile/Default/Site Characteristics Database/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile/Default/Site Characteristics Database/CURRENT +++ b/.edge-profile/Default/Site Characteristics Database/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile/Default/Site Characteristics Database/LOG b/.edge-profile/Default/Site Characteristics Database/LOG index 8d2a072..9d2842f 100644 --- a/.edge-profile/Default/Site Characteristics Database/LOG +++ b/.edge-profile/Default/Site Characteristics Database/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:23:18.357 2f44 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Site Characteristics Database since it was missing. -2026/03/25-16:23:18.381 2f44 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Site Characteristics Database/MANIFEST-000001 +2026/03/25-16:23:18.357 2f44 Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Site Characteristics Database since it was missing. +2026/03/25-16:23:18.381 2f44 Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Site Characteristics Database/MANIFEST-000001 diff --git a/.edge-profile/Default/Sync Data/LevelDB/CURRENT b/.edge-profile/Default/Sync Data/LevelDB/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile/Default/Sync Data/LevelDB/CURRENT +++ b/.edge-profile/Default/Sync Data/LevelDB/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile/Default/Sync Data/LevelDB/LOG b/.edge-profile/Default/Sync Data/LevelDB/LOG index f6e32f0..4b7ce08 100644 --- a/.edge-profile/Default/Sync Data/LevelDB/LOG +++ b/.edge-profile/Default/Sync Data/LevelDB/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:23:18.321 2f1c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Sync Data\LevelDB since it was missing. -2026/03/25-16:23:18.351 2f1c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Sync Data\LevelDB/MANIFEST-000001 +2026/03/25-16:23:18.321 2f1c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Sync Data\LevelDB since it was missing. +2026/03/25-16:23:18.351 2f1c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\Sync Data\LevelDB/MANIFEST-000001 diff --git a/.edge-profile/Default/shared_proto_db/CURRENT b/.edge-profile/Default/shared_proto_db/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile/Default/shared_proto_db/CURRENT +++ b/.edge-profile/Default/shared_proto_db/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile/Default/shared_proto_db/LOG b/.edge-profile/Default/shared_proto_db/LOG index e2bb007..1213ba3 100644 --- a/.edge-profile/Default/shared_proto_db/LOG +++ b/.edge-profile/Default/shared_proto_db/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:23:19.910 2f1c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\shared_proto_db since it was missing. -2026/03/25-16:23:19.925 2f1c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\shared_proto_db/MANIFEST-000001 +2026/03/25-16:23:19.910 2f1c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\shared_proto_db since it was missing. +2026/03/25-16:23:19.925 2f1c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\shared_proto_db/MANIFEST-000001 diff --git a/.edge-profile/Default/shared_proto_db/metadata/CURRENT b/.edge-profile/Default/shared_proto_db/metadata/CURRENT index 7ed683d..e9802a3 100644 --- a/.edge-profile/Default/shared_proto_db/metadata/CURRENT +++ b/.edge-profile/Default/shared_proto_db/metadata/CURRENT @@ -1 +1 @@ -MANIFEST-000001 +MANIFEST-000001 diff --git a/.edge-profile/Default/shared_proto_db/metadata/LOG b/.edge-profile/Default/shared_proto_db/metadata/LOG index 778d137..ed7eed2 100644 --- a/.edge-profile/Default/shared_proto_db/metadata/LOG +++ b/.edge-profile/Default/shared_proto_db/metadata/LOG @@ -1,2 +1,2 @@ -2026/03/25-16:23:19.882 2f1c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\shared_proto_db\metadata since it was missing. -2026/03/25-16:23:19.899 2f1c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\shared_proto_db\metadata/MANIFEST-000001 +2026/03/25-16:23:19.882 2f1c Creating DB C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\shared_proto_db\metadata since it was missing. +2026/03/25-16:23:19.899 2f1c Reusing MANIFEST C:\Users\User\Documents\greenlens\Greenlens\.edge-profile\Default\shared_proto_db\metadata/MANIFEST-000001 diff --git a/.env.example b/.env.example index adcef44..7f11568 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1,27 @@ - REVENUECAT_WEBHOOK_SECRET = greenlens-rc-webhook-2026 - REVENUECAT_PRO_ENTITLEMENT_ID = pro \ No newline at end of file +SITE_DOMAIN=greenlenspro.com +SITE_URL=https://greenlenspro.com + +POSTGRES_DB=greenlns +POSTGRES_USER=greenlns +POSTGRES_PASSWORD=change-me +DATABASE_URL=postgresql://greenlns:change-me@postgres:5432/greenlns + +JWT_SECRET=change-me + +MINIO_ACCESS_KEY=greenlns-minio +MINIO_SECRET_KEY=change-me +MINIO_BUCKET=plant-images +MINIO_PUBLIC_URL=https://greenlenspro.com/storage + +OPENAI_API_KEY= +OPENAI_SCAN_MODEL=gpt-5-mini +OPENAI_HEALTH_MODEL=gpt-5-mini + +STRIPE_SECRET_KEY= +STRIPE_PUBLISHABLE_KEY= +STRIPE_WEBHOOK_SECRET= + +REVENUECAT_WEBHOOK_SECRET= +REVENUECAT_PRO_ENTITLEMENT_ID=pro + +PLANT_IMPORT_ADMIN_KEY= diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..f579574 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,11 @@ +{ + "mcpServers": { + "apify": { + "type": "sse", + "url": "https://mcp.apify.com/sse", + "headers": { + "Authorization": "Bearer apify_api_0D7RWI6eW1H9LETBuLY7PHNpAErxL72ua6lo" + } + } + } +} diff --git a/CLAUDE.md b/CLAUDE.md index 86c6729..bbd74bf 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,102 +1,92 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Commands - -### Mobile App (Expo) -```bash -npm install # Install dependencies -npm run start # Start Expo dev server (offline mode) -npm run android # Start on Android -npm run ios # Start on iOS -npm run test # Run Jest tests -``` - -### Server (Express) -```bash -cd server -npm install -npm run start # Start Express server -npm run rebuild:batches # Rebuild plant catalog from batch constants -npm run diagnostics # Check duplicates and import audits -``` - -### Production Builds (EAS) -```bash -npx eas-cli build:version:set -p ios # Bump iOS build number -npx eas-cli build -p ios --profile production -npx eas-cli submit -p ios --latest # Submit to TestFlight -``` - -## Architecture - -### Mobile App -Expo Router with file-based routing. Entry point is `app/_layout.tsx`. - -- **`app/(tabs)/`** — Tab navigation: Home (`index.tsx`), Search, Profile -- **`app/scanner.tsx`** — Plant scan modal -- **`app/lexicon.tsx`** — Plant encyclopedia -- **`app/plant/`** — Plant detail screens -- **`app/auth/`** — Login / Signup screens -- **`app/onboarding.tsx`** — First-launch onboarding - -Global state lives in `context/AppContext.tsx` (plants, user, billing, language). - -### Services Layer (Mobile) -- `services/storageService.ts` — AsyncStorage persistence for user plants -- `services/plantRecognitionService.ts` — Calls `/v1/scan` on backend -- `services/plantDatabaseService.ts` — Local static plant data -- `services/authService.ts` — JWT auth against backend -- `services/backend/backendApiClient.ts` — HTTP client for all `/v1/*` calls -- `services/backend/mockBackendService.ts` — In-app mock if `EXPO_PUBLIC_BACKEND_URL` is not set - -### Backend (Express — `server/`) -Single `server/index.js` with all routes. Libs in `server/lib/`: - -- `sqlite.js` — SQLite wrapper (`openDatabase`, `run`, `get`, `all`) -- `plants.js` — Plant catalog CRUD + semantic search -- `auth.js` — JWT-based signup/login -- `billing.js` — Credits, idempotency, Stripe webhooks -- `openai.js` — Plant identification + health analysis via OpenAI -- `storage.js` — MinIO/S3 image upload (`uploadImage`, `ensureStorageBucket`) - -Key env vars for server: -``` -PLANT_DB_PATH # SQLite file path (default: server/data/greenlns.sqlite) -OPENAI_API_KEY -STRIPE_SECRET_KEY -JWT_SECRET -MINIO_ENDPOINT / MINIO_ACCESS_KEY / MINIO_SECRET_KEY / MINIO_BUCKET / MINIO_PUBLIC_URL -``` - -### Landing Page (`greenlns-landing/`) -Next.js 16 app with `output: 'standalone'` for Docker. Runs independently from the mobile app. - -Has its own `docker-compose.yml` that spins up: -- Next.js app (Landing Page) -- PostgreSQL 16 (persistent DB for the backend) -- MinIO (persistent image storage) -- Nginx (reverse proxy + SSL) - -### Infrastructure Plan -**Current state:** Server runs on Railway with SQLite (ephemeral). - -**Target state (not yet migrated):** -- Express Server moves OFF Railway → runs on the landing page server via `docker-compose.yml` -- PostgreSQL + MinIO replace SQLite + Railway hosting entirely - -**When migrating to PostgreSQL (do all of these together):** -1. Remove `server/lib/sqlite.js` and `server/data/` entirely -2. Remove Railway service for the Express server (no longer needed) -3. Add `pg` package to `server/package.json` -4. Replace all SQLite calls with `pg` and `DATABASE_URL` env var -5. Change all SQL placeholders from `?` to `$1, $2, ...` (SQLite → PostgreSQL syntax) -6. Add Express server as a service in `greenlens-landing/docker-compose.yml` -7. Use `JSONB` columns in PostgreSQL for nested data (e.g. `careInfo`, `categories`) instead of serialized strings — enables fast querying and filtering directly on JSON fields - -### Key Patterns -- SQL placeholders: SQLite uses `?`, PostgreSQL uses `$1, $2, ...` — important when migrating -- Translations: `utils/translations.ts` supports `de` / `en` / `es` -- Colors: `constants/Colors.ts` with light/dark mode tokens -- Image URIs: App sends base64 to `/v1/upload/image`, gets back a public MinIO URL +# CLAUDE.md + +This repository contains the GreenLens mobile app, the Express backend, and the self-hosted landing/deployment stack. + +## Commands + +### Mobile app +```bash +npm install +npm run start +npm run android +npm run ios +npm run test +``` + +### Backend +```bash +cd server +npm install +npm run start +npm run rebuild:batches +npm run diagnostics +``` + +### Production iOS builds +```bash +npx eas-cli build:version:set -p ios +npx eas-cli build -p ios --profile production +npx eas-cli submit -p ios --latest +``` + +## Architecture + +### Mobile app +- Expo Router entrypoint: `app/_layout.tsx` +- Global app state: `context/AppContext.tsx` +- Backend HTTP client: `services/backend/backendApiClient.ts` +- In-app fallback mock: `services/backend/mockBackendService.ts` + +### Backend +Single Express server in `server/index.js` with supporting modules in `server/lib/`: + +- `postgres.js` for PostgreSQL access +- `sqlite.js` as a compatibility shim re-exporting the PostgreSQL layer +- `plants.js` for plant catalog persistence and diagnostics +- `auth.js` for JWT auth +- `billing.js` for credits, RevenueCat, Stripe, and idempotency +- `openai.js` for scan and health-check model calls +- `storage.js` for MinIO/S3 object uploads + +Primary backend environment variables: + +```bash +DATABASE_URL +POSTGRES_HOST +POSTGRES_PORT +POSTGRES_DB +POSTGRES_USER +POSTGRES_PASSWORD +JWT_SECRET +OPENAI_API_KEY +STRIPE_SECRET_KEY +MINIO_ENDPOINT +MINIO_ACCESS_KEY +MINIO_SECRET_KEY +MINIO_BUCKET +MINIO_PUBLIC_URL +``` + +### Landing and deployment +`greenlns-landing/` is a Next.js 16 app built with `output: 'standalone'`. + +The production-style stack lives in `greenlns-landing/docker-compose.yml` and includes: + +- `caddy` for TLS and reverse proxy +- `landing` for the Next.js app +- `api` for the Express backend +- `postgres` for persistent app data +- `minio` for object storage + +`greenlns-landing/Caddyfile` routes: + +- `/` to the landing app +- `/api/*`, `/auth/*`, `/v1/*`, `/health`, `/plants/*` to the Express API +- `/storage/*` to MinIO + +## Data model notes + +- PostgreSQL is the source of truth for server persistence. +- Nested plant metadata such as `categories` and `careInfo` uses `JSONB`. +- Billing idempotency responses also use `JSONB`. +- SQL placeholders use PostgreSQL syntax: `$1`, `$2`, ... diff --git a/README.md b/README.md index 56ea5bd..66974cf 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,187 @@ -# GreenLens - -Expo app for plant scanning, care tracking, lexicon browsing, and profile settings. - -## Run locally - -1. Install dependencies: - - `npm install` -2. Start Expo: - - `npm run start` - -## iOS TestFlight (EAS) - -Use these three commands in order: - -1. Set iOS build number: - - `npx eas-cli build:version:set -p ios` -2. Create production iOS build: - - `npx eas-cli build -p ios --profile production` -3. Submit latest iOS build to TestFlight: - - `npx eas-cli submit -p ios --latest` - -## Lexicon SQLite maintenance - -The server now uses a persistent SQLite database (`server/data/greenlns.sqlite`) and supports validated rebuilds. - -1. Install server dependencies: - - `cd server && npm install` -2. Run the server: - - `npm run start` -3. Rebuild plants from the local lexicon batch constants: - - `npm run rebuild:batches` -4. Check duplicates and import audits: - - `npm run diagnostics` - -For protected rebuild endpoints, set `PLANT_IMPORT_ADMIN_KEY` and send `x-admin-key` in requests. - -### Local plant images - -The lexicon now supports storing plant image paths in SQLite as local public paths instead of external URLs. - -Recommended structure: - -- Database field: `imageUri` -- Value example: `/plants/monstera-deliciosa.webp` -- File location on disk: `server/public/plants/monstera-deliciosa.webp` - -Notes: - -- The Express server serves `server/public/plants` at `/plants/*`. -- Remote `https://...` image URLs still work, so migration can be incremental. -- Keep the database focused on metadata and store only the image path, not binary blobs. - -## Billing and backend simulation - -The app now uses a backend API contract for paid AI features: - -- Scan AI (`/v1/scan`) -- Semantic AI search (`/v1/search/semantic`) -- Billing summary (`/v1/billing/summary`) -- Health check AI (`/v1/health-check`) - -The Node server in `server/index.js` now implements these `/v1` routes directly and uses: - -- `server/lib/openai.js` for OpenAI calls -- `server/lib/billing.js` for credit/billing/idempotency state - -If `EXPO_PUBLIC_BACKEND_URL` is not set, the app uses an in-app mock backend simulation for `/v1/*` API calls. -`EXPO_PUBLIC_PAYMENT_SERVER_URL` is used only for Stripe PaymentSheet calls (`/api/payment-sheet`). -The in-app mock backend provides: - -- Server-side style credit enforcement -- Atomic `consumeCredit()` behavior -- Idempotency-key handling -- Free and Pro monthly credit buckets -- Top-up purchase simulation -- RevenueCat/Stripe webhook simulation - -This makes it possible to build UI and flow now, then replace mock endpoints with a real backend later. - -## Production integration notes - -- Keep OpenAI keys only on the backend. -- Use app-store billing via RevenueCat or StoreKit/Play Billing. -- Forward entitlement updates to backend webhooks. -- Enforce credits on backend only; app should only display UX quota. -- Recommended backend env vars: - - `OPENAI_API_KEY` - - `OPENAI_SCAN_MODEL` (for example `gpt-5`) - - `OPENAI_HEALTH_MODEL` (for example `gpt-5`) - - `STRIPE_SECRET_KEY` - - `STRIPE_PUBLISHABLE_KEY` +# GreenLens + +Expo app for plant scanning, care tracking, billing, and profile management, backed by an Express API. + +## App development + +```bash +npm install +npm run start +``` + +## Backend development + +The backend now targets PostgreSQL instead of SQLite. + +```bash +cd server +npm install +npm run start +``` + +Required backend environment: + +- `DATABASE_URL` or `POSTGRES_HOST` + `POSTGRES_PORT` + `POSTGRES_DB` + `POSTGRES_USER` + `POSTGRES_PASSWORD` +- `JWT_SECRET` + +Optional integrations: + +- `OPENAI_API_KEY` +- `STRIPE_SECRET_KEY` +- `STRIPE_PUBLISHABLE_KEY` +- `STRIPE_WEBHOOK_SECRET` +- `REVENUECAT_WEBHOOK_SECRET` +- `PLANT_IMPORT_ADMIN_KEY` +- `MINIO_ENDPOINT` +- `MINIO_ACCESS_KEY` +- `MINIO_SECRET_KEY` +- `MINIO_BUCKET` +- `MINIO_PUBLIC_URL` + +## Docker Compose + +For backend-only local infrastructure use [docker-compose.yml](/abs/path/C:/Users/a931627/Documents/apps/GreenLns/docker-compose.yml). + +For the production-style self-hosted stack with landing page, Caddy, API, PostgreSQL, and MinIO use [greenlns-landing/docker-compose.yml](/abs/path/C:/Users/a931627/Documents/apps/GreenLns/greenlns-landing/docker-compose.yml). + +## Server deployment + +Run the commands in this section from the repo root on your server: + +```bash +cd /path/to/GreenLns +``` + +Example: + +```bash +cd /var/www/GreenLns +``` + +### 1. Prepare environment + +```bash +cp .env.example .env +``` + +Then fill at least: + +- `SITE_DOMAIN` +- `SITE_URL` +- `POSTGRES_PASSWORD` +- `JWT_SECRET` +- `MINIO_SECRET_KEY` +- optional: `OPENAI_API_KEY`, `STRIPE_*`, `REVENUECAT_*` + +### 2. Start the full production stack + +```bash +docker compose up --build -d +``` + +When you run this from the repo root, Docker Compose uses [docker-compose.yml](/abs/path/C:/Users/a931627/Documents/apps/GreenLns/docker-compose.yml). + +What gets built: + +- `landing` is built from `./greenlns-landing/Dockerfile` +- `api` is built from `./server/Dockerfile` + +What is not built locally, but pulled as ready-made images: + +- `postgres` uses `postgres:16-alpine` +- `minio` uses `minio/minio:latest` +- `caddy` uses `caddy:2.8-alpine` + +So yes: `docker compose up --build -d` builds the landing page container and the API container, and it starts PostgreSQL as a container. PostgreSQL is not "built" from your code, it is started from the official Postgres image. + +This starts: + +- `caddy` +- `landing` +- `api` +- `postgres` +- `minio` + +### 3. Useful server commands + +Check running containers: + +```bash +docker compose ps +``` + +Follow all logs: + +```bash +docker compose logs -f +``` + +Follow only API logs: + +```bash +docker compose logs -f api +``` + +Follow only landing logs: + +```bash +docker compose logs -f landing +``` + +Restart one service: + +```bash +docker compose restart api +docker compose restart landing +``` + +Rebuild and restart after code changes: + +```bash +docker compose up --build -d +``` + +Stop the stack: + +```bash +docker compose down +``` + +Stop the stack and remove volumes: + +```bash +docker compose down -v +``` + +### 4. Health checks after deploy + +```bash +curl https://greenlenspro.com/health +curl https://greenlenspro.com/ +curl https://greenlenspro.com/sitemap.xml +``` + +### 5. Production compose file location + +If you want to run the same stack from inside the landing directory instead: + +```bash +cd greenlns-landing +docker compose up --build -d +``` + +In that case Docker Compose uses [greenlns-landing/docker-compose.yml](/abs/path/C:/Users/a931627/Documents/apps/GreenLns/greenlns-landing/docker-compose.yml). + +There, too: + +- `landing` is built from `greenlns-landing/Dockerfile` +- `api` is built from `../server/Dockerfile` +- `postgres`, `minio`, and `caddy` are started from official images + +## iOS TestFlight + +```bash +npx eas-cli build:version:set -p ios +npx eas-cli build -p ios --profile production +npx eas-cli submit -p ios --latest +``` diff --git a/__tests__/server/plantsSearch.test.js b/__tests__/server/plantsSearch.test.js index f22e3cd..9162d19 100644 --- a/__tests__/server/plantsSearch.test.js +++ b/__tests__/server/plantsSearch.test.js @@ -1,20 +1,16 @@ -const fs = require('fs'); -const os = require('os'); -const path = require('path'); - -const { closeDatabase, openDatabase, run } = require('../../server/lib/sqlite'); -const { ensurePlantSchema, getPlants } = require('../../server/lib/plants'); - -describe('server plant search ranking', () => { - let db; - let dbPath; - - beforeAll(async () => { - dbPath = path.join(os.tmpdir(), `greenlns-search-${Date.now()}.sqlite`); - db = await openDatabase(dbPath); - await ensurePlantSchema(db); - - const entries = [ +const { closeDatabase, openDatabase } = require('../../server/lib/sqlite'); +const { ensurePlantSchema, getPlants, rebuildPlantsCatalog } = require('../../server/lib/plants'); + +const describeIfDatabase = process.env.DATABASE_URL ? describe : describe.skip; + +describeIfDatabase('server plant search ranking', () => { + let db; + + beforeAll(async () => { + db = await openDatabase(); + await ensurePlantSchema(db); + + const entries = [ { id: '1', name: 'Snake Plant', @@ -83,45 +79,18 @@ describe('server plant search ranking', () => { }, ]; - for (const entry of entries) { - await run( - db, - `INSERT INTO plants ( - id, - name, - botanicalName, - imageUri, - imageStatus, - description, - categories, - careInfo, - confidence, - createdAt, - updatedAt - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now'))`, - [ - entry.id, - entry.name, - entry.botanicalName, - entry.imageUri, - entry.imageStatus, - entry.description, - JSON.stringify(entry.categories), - JSON.stringify(entry.careInfo), - entry.confidence, - ], - ); - } - }); - - afterAll(async () => { - if (db) { - await closeDatabase(db); - } - if (dbPath && fs.existsSync(dbPath)) { - fs.unlinkSync(dbPath); - } - }); + await rebuildPlantsCatalog(db, entries, { + source: 'plantsSearch.test', + preserveExistingIds: false, + enforceUniqueImages: true, + }); + }); + + afterAll(async () => { + if (db) { + await closeDatabase(db); + } + }); it('returns exact common name matches first', async () => { const results = await getPlants(db, { query: 'Monstera', limit: 3 }); diff --git a/__tests__/services/mockBackendService.test.ts b/__tests__/services/mockBackendService.test.ts index 4de77db..2b798be 100644 --- a/__tests__/services/mockBackendService.test.ts +++ b/__tests__/services/mockBackendService.test.ts @@ -196,4 +196,81 @@ describe('mockBackendService billing simulation', () => { expect(second.billing.credits.topupBalance).toBe(25); }); + + it('ignores malformed pro entitlements coming from top-up customer info', async () => { + const response = await mockBackendService.syncRevenueCatState({ + userId: 'test-user-rc-topup-misconfigured-entitlement', + source: 'topup_purchase', + customerInfo: { + entitlements: { + active: { + pro: { + productIdentifier: 'topup_small', + expirationDate: '2026-04-30T00:00:00.000Z', + }, + }, + }, + nonSubscriptions: { + topup_small: [ + { + productIdentifier: 'topup_small', + transactionIdentifier: 'rc-topup-malformed-1', + }, + ], + }, + }, + }); + + expect(response.billing.entitlement.plan).toBe('free'); + expect(response.billing.entitlement.status).toBe('inactive'); + expect(response.billing.credits.topupBalance).toBe(25); + expect(response.billing.credits.available).toBe(40); + }); + + it('does not downgrade an existing pro user during a top-up sync', async () => { + const userId = 'test-user-rc-pro-topup'; + + await mockBackendService.syncRevenueCatState({ + userId, + source: 'subscription_purchase', + customerInfo: { + entitlements: { + active: { + pro: { + productIdentifier: 'monthly_pro', + expirationDate: '2026-04-30T00:00:00.000Z', + }, + }, + }, + nonSubscriptions: {}, + }, + }); + + const response = await mockBackendService.syncRevenueCatState({ + userId, + source: 'topup_purchase', + customerInfo: { + entitlements: { + active: { + pro: { + productIdentifier: 'topup_small', + expirationDate: '2026-04-30T00:00:00.000Z', + }, + }, + }, + nonSubscriptions: { + topup_small: [ + { + productIdentifier: 'topup_small', + transactionIdentifier: 'rc-topup-pro-1', + }, + ], + }, + }, + }); + + expect(response.billing.entitlement.plan).toBe('pro'); + expect(response.billing.credits.available).toBe(275); + expect(response.billing.credits.topupBalance).toBe(25); + }); }); diff --git a/app/_layout.tsx b/app/_layout.tsx index a013d34..6407075 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -94,7 +94,7 @@ function RootLayoutInner() { await Purchases.logIn(session.serverUserId); const customerInfo = await Purchases.getCustomerInfo(); if (!cancelled) { - await syncRevenueCatState(customerInfo as any); + await syncRevenueCatState(customerInfo as any, 'app_init'); } } else { await Purchases.logOut(); diff --git a/app/profile/billing.tsx b/app/profile/billing.tsx index d76059d..6f8bdb0 100644 --- a/app/profile/billing.tsx +++ b/app/profile/billing.tsx @@ -4,12 +4,68 @@ import { SafeAreaView } from 'react-native-safe-area-context'; import { Ionicons } from '@expo/vector-icons'; import { useRouter } from 'expo-router'; import Constants from 'expo-constants'; -import Purchases, { PRODUCT_CATEGORY } from 'react-native-purchases'; +import Purchases, { + PACKAGE_TYPE, + PRODUCT_CATEGORY, + PurchasesOffering, + PurchasesPackage, + PurchasesStoreProduct, +} from 'react-native-purchases'; import { useApp } from '../../context/AppContext'; import { useColors } from '../../constants/Colors'; import { ThemeBackdrop } from '../../components/ThemeBackdrop'; -import { Language } from '../../types'; -import { PurchaseProductId } from '../../services/backend/contracts'; +import { Language } from '../../types'; +import { PurchaseProductId } from '../../services/backend/contracts'; + +type SubscriptionProductId = 'monthly_pro' | 'yearly_pro'; +type TopupProductId = Extract; +type SubscriptionPackages = Partial>; +type TopupProducts = Partial>; + +const isMatchingPackage = ( + pkg: PurchasesPackage, + productId: SubscriptionProductId, + expectedPackageType: PACKAGE_TYPE, +) => { + return ( + pkg.product.identifier === productId + || pkg.identifier === productId + || pkg.packageType === expectedPackageType + ); +}; + +const resolveSubscriptionPackages = (offering: PurchasesOffering | null): SubscriptionPackages => { + if (!offering) { + return {}; + } + + const availablePackages = [ + offering.monthly, + offering.annual, + ...offering.availablePackages, + ].filter((value): value is PurchasesPackage => Boolean(value)); + + return { + monthly_pro: availablePackages.find((pkg) => isMatchingPackage(pkg, 'monthly_pro', PACKAGE_TYPE.MONTHLY)), + yearly_pro: availablePackages.find((pkg) => isMatchingPackage(pkg, 'yearly_pro', PACKAGE_TYPE.ANNUAL)), + }; +}; + +const summarizeOfferingPackages = (offering: PurchasesOffering | null) => { + if (!offering) { + return { identifier: null, packages: [] as Array> }; + } + + return { + identifier: offering.identifier, + packages: offering.availablePackages.map((pkg) => ({ + identifier: pkg.identifier, + packageType: pkg.packageType, + productIdentifier: pkg.product.identifier, + priceString: pkg.product.priceString, + })), + }; +}; const getBillingCopy = (language: Language) => { if (language === 'de') { @@ -161,8 +217,8 @@ export default function BillingScreen() { const [subModalVisible, setSubModalVisible] = useState(false); const [isUpdating, setIsUpdating] = useState(false); const [storeReady, setStoreReady] = useState(isExpoGo); - const [subscriptionPackages, setSubscriptionPackages] = useState>>({}); - const [topupProducts, setTopupProducts] = useState>>({}); + const [subscriptionPackages, setSubscriptionPackages] = useState({}); + const [topupProducts, setTopupProducts] = useState({}); // Cancel Flow State const [cancelStep, setCancelStep] = useState<'none' | 'survey' | 'offer'>('none'); @@ -187,11 +243,13 @@ export default function BillingScreen() { if (cancelled) return; - const currentOffering = offerings.current; - setSubscriptionPackages({ - monthly_pro: currentOffering?.monthly ?? undefined, - yearly_pro: currentOffering?.annual ?? undefined, - }); + const currentOffering = offerings.current; + const resolvedPackages = resolveSubscriptionPackages(currentOffering); + if (!resolvedPackages.monthly_pro || !resolvedPackages.yearly_pro) { + console.warn('[Billing] RevenueCat offering missing expected subscription packages', summarizeOfferingPackages(currentOffering)); + } + + setSubscriptionPackages(resolvedPackages); setTopupProducts({ topup_small: topups.find((product) => product.identifier === 'topup_small'), @@ -244,22 +302,29 @@ export default function BillingScreen() { return; } const selectedPackage = productId === 'monthly_pro' ? monthlyPackage : yearlyPackage; - if (!selectedPackage) { + const latestOffering = !selectedPackage + ? await Purchases.getOfferings().then((offerings) => offerings.current) + : null; + if (!selectedPackage) { + console.warn('[Billing] Purchase blocked because subscription package was not resolved', { + productId, + offering: summarizeOfferingPackages(latestOffering), + }); throw new Error('Abo-Paket konnte nicht geladen werden. Bitte RevenueCat Offering prüfen.'); } await Purchases.purchasePackage(selectedPackage); // Derive plan locally from RevenueCat — backend sync via webhook comes later (Step 3) const customerInfo = await Purchases.getCustomerInfo(); - await syncRevenueCatState(customerInfo as any); - } else { + await syncRevenueCatState(customerInfo as any, 'subscription_purchase'); + } else { const selectedProduct = topupProducts[productId]; if (!selectedProduct) { throw new Error('Top-up Produkt konnte nicht geladen werden. Bitte Store-Produkt IDs prüfen.'); } await Purchases.purchaseStoreProduct(selectedProduct); const customerInfo = await Purchases.getCustomerInfo(); - await syncRevenueCatState(customerInfo as any); - } + await syncRevenueCatState(customerInfo as any, 'topup_purchase'); + } } setSubModalVisible(false); } catch (e) { @@ -282,7 +347,7 @@ export default function BillingScreen() { try { if (!isExpoGo) { const customerInfo = await Purchases.restorePurchases(); - await syncRevenueCatState(customerInfo as any); + await syncRevenueCatState(customerInfo as any, 'restore'); } Alert.alert(copy.restorePurchases, '✓'); } catch (e) { @@ -413,11 +478,11 @@ export default function BillingScreen() { - Linking.openURL('https://greenlns-landing.vercel.app/privacy')}> + Linking.openURL('https://greenlenspro.com/privacy')}> Privacy Policy · - Linking.openURL('https://greenlns-landing.vercel.app/terms')}> + Linking.openURL('https://greenlenspro.com/terms')}> Terms of Use @@ -467,11 +532,11 @@ export default function BillingScreen() { ))} - Linking.openURL('https://greenlns-landing.vercel.app/privacy')}> + Linking.openURL('https://greenlenspro.com/privacy')}> Privacy Policy · - Linking.openURL('https://greenlns-landing.vercel.app/terms')}> + Linking.openURL('https://greenlenspro.com/terms')}> Terms of Use @@ -524,10 +589,10 @@ export default function BillingScreen() { styles.planOption, { borderColor: colors.border }, planId === 'pro' && { borderColor: colors.primary, backgroundColor: colors.primary + '10' } - ]} - onPress={() => handlePurchase('monthly_pro')} - disabled={isUpdating} - > + ]} + onPress={() => handlePurchase('monthly_pro')} + disabled={isUpdating || !storeReady} + > {copy.proPlanName} @@ -582,11 +647,11 @@ export default function BillingScreen() { - Linking.openURL('https://greenlns-landing.vercel.app/privacy')}> + Linking.openURL('https://greenlenspro.com/privacy')}> Privacy Policy · - Linking.openURL('https://greenlns-landing.vercel.app/terms')}> + Linking.openURL('https://greenlenspro.com/terms')}> Terms of Use diff --git a/components/CoachMarksOverlay.tsx b/components/CoachMarksOverlay.tsx index e01d130..dffa2ca 100644 --- a/components/CoachMarksOverlay.tsx +++ b/components/CoachMarksOverlay.tsx @@ -1,286 +1,286 @@ -import React, { useEffect, useRef } from 'react'; -import { - View, - Text, - TouchableOpacity, - StyleSheet, - Dimensions, - Animated, -} from 'react-native'; -import { Ionicons } from '@expo/vector-icons'; -import { useCoachMarks } from '../context/CoachMarksContext'; -import { useApp } from '../context/AppContext'; -import { useColors } from '../constants/Colors'; - -const { width: SCREEN_W, height: SCREEN_H } = Dimensions.get('window'); -const HIGHLIGHT_PADDING = 10; -const TOOLTIP_VERTICAL_OFFSET = 32; - -export const CoachMarksOverlay: React.FC = () => { - const { isActive, currentStep, steps, layouts, next, skip } = useCoachMarks(); - const { isDarkMode, colorPalette, t } = useApp(); - const colors = useColors(isDarkMode, colorPalette); - - const fadeAnim = useRef(new Animated.Value(0)).current; - const scaleAnim = useRef(new Animated.Value(0.88)).current; - const pulseAnim = useRef(new Animated.Value(1)).current; - - useEffect(() => { - if (isActive) { - fadeAnim.setValue(0); - scaleAnim.setValue(0.88); - Animated.parallel([ - Animated.timing(fadeAnim, { toValue: 1, duration: 320, useNativeDriver: true }), - Animated.spring(scaleAnim, { toValue: 1, tension: 80, friction: 9, useNativeDriver: true }), - ]).start(); - - Animated.loop( - Animated.sequence([ - Animated.timing(pulseAnim, { toValue: 1.06, duration: 900, useNativeDriver: true }), - Animated.timing(pulseAnim, { toValue: 1, duration: 900, useNativeDriver: true }), - ]), - ).start(); - } else { - pulseAnim.stopAnimation(); - } - }, [currentStep, fadeAnim, isActive, pulseAnim, scaleAnim]); - - if (!isActive || steps.length === 0) return null; - - const step = steps[currentStep]; - const layout = layouts[step.elementKey]; - - const highlight = layout - ? { - x: layout.x - HIGHLIGHT_PADDING, - y: layout.y - HIGHLIGHT_PADDING, - w: layout.width + HIGHLIGHT_PADDING * 2, - h: layout.height + HIGHLIGHT_PADDING * 2, - r: Math.min(layout.width, layout.height) / 2 + HIGHLIGHT_PADDING, - } - : { x: SCREEN_W / 2 - 40, y: SCREEN_H / 2 - 40, w: 80, h: 80, r: 40 }; - - const tooltipW = 260; - const tooltipMaxH = 140; - const tooltipX = Math.max( - 12, - Math.min(SCREEN_W - tooltipW - 12, highlight.x + highlight.w / 2 - tooltipW / 2), - ); - - let tooltipY: number; - const spaceBelow = SCREEN_H - (highlight.y + highlight.h); - const spaceAbove = highlight.y; - - if (step.tooltipSide === 'above' || (step.tooltipSide !== 'below' && spaceAbove > spaceBelow)) { - tooltipY = highlight.y - tooltipMaxH - 24; - if (tooltipY < 60) tooltipY = highlight.y + highlight.h + 24; - } else { - tooltipY = highlight.y + highlight.h + 24; - if (tooltipY + tooltipMaxH > SCREEN_H - 60) tooltipY = highlight.y - tooltipMaxH - 24; - } - - tooltipY -= TOOLTIP_VERTICAL_OFFSET; - tooltipY = Math.max(24, Math.min(SCREEN_H - tooltipMaxH - 24, tooltipY)); - - const arrowPointsUp = tooltipY > highlight.y; - - return ( - - - - - - - - - - - - - {steps.map((_, i) => ( - - ))} - - - {step.title} - {step.description} - - - - {t.coachSkip} - - - - {currentStep === steps.length - 1 ? t.coachDone : t.coachNext} - - - - - - - ); -}; - -const styles = StyleSheet.create({ - root: { - zIndex: 9999, - elevation: 9999, - }, - overlay: { - position: 'absolute', - backgroundColor: 'rgba(0,0,0,0.72)', - }, - highlightRing: { - position: 'absolute', - borderWidth: 2.5, - }, - tooltip: { - position: 'absolute', - borderRadius: 18, - borderWidth: 1, - padding: 16, - gap: 8, - shadowOffset: { width: 0, height: 8 }, - shadowOpacity: 0.2, - shadowRadius: 20, - elevation: 12, - }, - stepRow: { - flexDirection: 'row', - gap: 4, - alignItems: 'center', - marginBottom: 2, - }, - stepDot: { - width: 6, - height: 6, - borderRadius: 3, - }, - tooltipTitle: { - fontSize: 15, - fontWeight: '700', - lineHeight: 20, - }, - tooltipDesc: { - fontSize: 13, - lineHeight: 18, - }, - tooltipFooter: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - marginTop: 4, - }, - skipBtn: { - padding: 4, - }, - skipText: { - fontSize: 13, - }, - nextBtn: { - flexDirection: 'row', - alignItems: 'center', - gap: 6, - paddingHorizontal: 16, - paddingVertical: 9, - borderRadius: 20, - }, - nextText: { - fontSize: 13, - fontWeight: '600', - }, - arrow: { - position: 'absolute', - width: 0, - height: 0, - borderLeftWidth: 8, - borderRightWidth: 8, - borderLeftColor: 'transparent', - borderRightColor: 'transparent', - }, - arrowUp: { - top: -8, - borderBottomWidth: 8, - }, - arrowDown: { - bottom: -8, - borderTopWidth: 8, - }, -}); +import React, { useEffect, useRef } from 'react'; +import { + View, + Text, + TouchableOpacity, + StyleSheet, + Dimensions, + Animated, +} from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { useCoachMarks } from '../context/CoachMarksContext'; +import { useApp } from '../context/AppContext'; +import { useColors } from '../constants/Colors'; + +const { width: SCREEN_W, height: SCREEN_H } = Dimensions.get('window'); +const HIGHLIGHT_PADDING = 10; +const TOOLTIP_VERTICAL_OFFSET = 32; + +export const CoachMarksOverlay: React.FC = () => { + const { isActive, currentStep, steps, layouts, next, skip } = useCoachMarks(); + const { isDarkMode, colorPalette, t } = useApp(); + const colors = useColors(isDarkMode, colorPalette); + + const fadeAnim = useRef(new Animated.Value(0)).current; + const scaleAnim = useRef(new Animated.Value(0.88)).current; + const pulseAnim = useRef(new Animated.Value(1)).current; + + useEffect(() => { + if (isActive) { + fadeAnim.setValue(0); + scaleAnim.setValue(0.88); + Animated.parallel([ + Animated.timing(fadeAnim, { toValue: 1, duration: 320, useNativeDriver: true }), + Animated.spring(scaleAnim, { toValue: 1, tension: 80, friction: 9, useNativeDriver: true }), + ]).start(); + + Animated.loop( + Animated.sequence([ + Animated.timing(pulseAnim, { toValue: 1.06, duration: 900, useNativeDriver: true }), + Animated.timing(pulseAnim, { toValue: 1, duration: 900, useNativeDriver: true }), + ]), + ).start(); + } else { + pulseAnim.stopAnimation(); + } + }, [currentStep, fadeAnim, isActive, pulseAnim, scaleAnim]); + + if (!isActive || steps.length === 0) return null; + + const step = steps[currentStep]; + const layout = layouts[step.elementKey]; + + const highlight = layout + ? { + x: layout.x - HIGHLIGHT_PADDING, + y: layout.y - HIGHLIGHT_PADDING, + w: layout.width + HIGHLIGHT_PADDING * 2, + h: layout.height + HIGHLIGHT_PADDING * 2, + r: Math.min(layout.width, layout.height) / 2 + HIGHLIGHT_PADDING, + } + : { x: SCREEN_W / 2 - 40, y: SCREEN_H / 2 - 40, w: 80, h: 80, r: 40 }; + + const tooltipW = 260; + const tooltipMaxH = 140; + const tooltipX = Math.max( + 12, + Math.min(SCREEN_W - tooltipW - 12, highlight.x + highlight.w / 2 - tooltipW / 2), + ); + + let tooltipY: number; + const spaceBelow = SCREEN_H - (highlight.y + highlight.h); + const spaceAbove = highlight.y; + + if (step.tooltipSide === 'above' || (step.tooltipSide !== 'below' && spaceAbove > spaceBelow)) { + tooltipY = highlight.y - tooltipMaxH - 24; + if (tooltipY < 60) tooltipY = highlight.y + highlight.h + 24; + } else { + tooltipY = highlight.y + highlight.h + 24; + if (tooltipY + tooltipMaxH > SCREEN_H - 60) tooltipY = highlight.y - tooltipMaxH - 24; + } + + tooltipY -= TOOLTIP_VERTICAL_OFFSET; + tooltipY = Math.max(24, Math.min(SCREEN_H - tooltipMaxH - 24, tooltipY)); + + const arrowPointsUp = tooltipY > highlight.y; + + return ( + + + + + + + + + + + + + {steps.map((_, i) => ( + + ))} + + + {step.title} + {step.description} + + + + {t.coachSkip} + + + + {currentStep === steps.length - 1 ? t.coachDone : t.coachNext} + + + + + + + ); +}; + +const styles = StyleSheet.create({ + root: { + zIndex: 9999, + elevation: 9999, + }, + overlay: { + position: 'absolute', + backgroundColor: 'rgba(0,0,0,0.72)', + }, + highlightRing: { + position: 'absolute', + borderWidth: 2.5, + }, + tooltip: { + position: 'absolute', + borderRadius: 18, + borderWidth: 1, + padding: 16, + gap: 8, + shadowOffset: { width: 0, height: 8 }, + shadowOpacity: 0.2, + shadowRadius: 20, + elevation: 12, + }, + stepRow: { + flexDirection: 'row', + gap: 4, + alignItems: 'center', + marginBottom: 2, + }, + stepDot: { + width: 6, + height: 6, + borderRadius: 3, + }, + tooltipTitle: { + fontSize: 15, + fontWeight: '700', + lineHeight: 20, + }, + tooltipDesc: { + fontSize: 13, + lineHeight: 18, + }, + tooltipFooter: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginTop: 4, + }, + skipBtn: { + padding: 4, + }, + skipText: { + fontSize: 13, + }, + nextBtn: { + flexDirection: 'row', + alignItems: 'center', + gap: 6, + paddingHorizontal: 16, + paddingVertical: 9, + borderRadius: 20, + }, + nextText: { + fontSize: 13, + fontWeight: '600', + }, + arrow: { + position: 'absolute', + width: 0, + height: 0, + borderLeftWidth: 8, + borderRightWidth: 8, + borderLeftColor: 'transparent', + borderRightColor: 'transparent', + }, + arrowUp: { + top: -8, + borderBottomWidth: 8, + }, + arrowDown: { + bottom: -8, + borderTopWidth: 8, + }, +}); diff --git a/context/AppContext.tsx b/context/AppContext.tsx index 5481750..47b74ac 100644 --- a/context/AppContext.tsx +++ b/context/AppContext.tsx @@ -12,7 +12,14 @@ import { import { ImageCacheService } from '../services/imageCacheService'; import { getTranslation } from '../utils/translations'; import { backendApiClient } from '../services/backend/backendApiClient'; -import { BillingSummary, PurchaseProductId, RevenueCatCustomerInfo, SimulatedWebhookEvent } from '../services/backend/contracts'; +import { + BillingSummary, + PurchaseProductId, + RevenueCatCustomerInfo, + RevenueCatEntitlementInfo, + RevenueCatSyncSource, + SimulatedWebhookEvent, +} from '../services/backend/contracts'; import { createIdempotencyKey } from '../utils/idempotency'; import { AuthService, AuthSession } from '../services/authService'; import { PlantsDb, SettingsDb, LexiconHistoryDb, AppMetaDb } from '../services/database'; @@ -43,7 +50,7 @@ interface AppState { updatePlant: (plant: Plant) => void; refreshPlants: () => void; refreshBillingSummary: () => Promise; - syncRevenueCatState: (customerInfo: RevenueCatCustomerInfo) => Promise; + syncRevenueCatState: (customerInfo: RevenueCatCustomerInfo, source?: RevenueCatSyncSource) => Promise; simulatePurchase: (productId: PurchaseProductId) => Promise; simulateWebhookEvent: (event: SimulatedWebhookEvent, payload?: { credits?: number }) => Promise; getLexiconSearchHistory: () => string[]; @@ -70,11 +77,47 @@ export const useApp = () => { return ctx; }; -const isAppearanceMode = (v: string): v is AppearanceMode => - v === 'system' || v === 'light' || v === 'dark'; -const isColorPalette = (v: string): v is ColorPalette => - v === 'forest' || v === 'ocean' || v === 'sunset' || v === 'mono'; -const isLanguage = (v: string): v is Language => v === 'de' || v === 'en' || v === 'es'; +const isAppearanceMode = (v: string): v is AppearanceMode => + v === 'system' || v === 'light' || v === 'dark'; +const isColorPalette = (v: string): v is ColorPalette => + v === 'forest' || v === 'ocean' || v === 'sunset' || v === 'mono'; +const isLanguage = (v: string): v is Language => v === 'de' || v === 'en' || v === 'es'; +const REVENUECAT_PRO_ENTITLEMENT_ID = (process.env.EXPO_PUBLIC_REVENUECAT_PRO_ENTITLEMENT_ID || 'pro').trim() || 'pro'; +const SUPPORTED_REVENUECAT_SUBSCRIPTION_PRODUCTS = new Set(['monthly_pro', 'yearly_pro']); + +const summarizeRevenueCatCustomerInfo = (customerInfo: RevenueCatCustomerInfo) => { + const activeEntitlements = customerInfo?.entitlements?.active || {}; + return { + appUserId: customerInfo?.appUserId ?? null, + originalAppUserId: customerInfo?.originalAppUserId ?? null, + activeEntitlements: Object.entries(activeEntitlements).map(([id, entitlement]) => ({ + id, + productIdentifier: entitlement?.productIdentifier ?? null, + expirationDate: entitlement?.expirationDate || entitlement?.expiresDate || null, + })), + allPurchasedProductIdentifiers: customerInfo?.allPurchasedProductIdentifiers ?? [], + nonSubscriptionTransactions: Object.values(customerInfo?.nonSubscriptions || {}).flatMap((entries) => + (Array.isArray(entries) ? entries : []).map((transaction) => ({ + productIdentifier: transaction?.productIdentifier ?? null, + transactionIdentifier: transaction?.transactionIdentifier || transaction?.transactionId || null, + }))), + }; +}; + +const getValidProEntitlement = (customerInfo: RevenueCatCustomerInfo): RevenueCatEntitlementInfo | null => { + const activeEntitlements = customerInfo?.entitlements?.active || {}; + const proEntitlement = activeEntitlements[REVENUECAT_PRO_ENTITLEMENT_ID]; + if (!proEntitlement) { + return null; + } + + if (proEntitlement.productIdentifier && SUPPORTED_REVENUECAT_SUBSCRIPTION_PRODUCTS.has(proEntitlement.productIdentifier as PurchaseProductId)) { + return proEntitlement; + } + + console.warn('[Billing] Ignoring unsupported RevenueCat pro entitlement during local sync', summarizeRevenueCatCustomerInfo(customerInfo)); + return null; +}; const getDeviceLanguage = (): Language => { try { @@ -341,14 +384,25 @@ export const AppProvider: React.FC<{ children: React.ReactNode }> = ({ children // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const applyRevenueCatCustomerInfoLocally = useCallback((customerInfo: RevenueCatCustomerInfo) => { - const entitlementId = (process.env.EXPO_PUBLIC_REVENUECAT_PRO_ENTITLEMENT_ID || 'pro').trim() || 'pro'; + const applyRevenueCatCustomerInfoLocally = useCallback(( + customerInfo: RevenueCatCustomerInfo, + source: RevenueCatSyncSource = 'app_init', + ) => { + if (source === 'topup_purchase') { + return; + } + const activeEntitlements = customerInfo?.entitlements?.active || {}; - const proEntitlement = activeEntitlements[entitlementId]; + const rawProEntitlement = activeEntitlements[REVENUECAT_PRO_ENTITLEMENT_ID]; + const proEntitlement = getValidProEntitlement(customerInfo); const isPro = Boolean(proEntitlement); setBillingSummary((prev) => { if (!prev) return prev; + if (!proEntitlement && rawProEntitlement) { + return prev; + } + return { ...prev, entitlement: { @@ -362,10 +416,17 @@ export const AppProvider: React.FC<{ children: React.ReactNode }> = ({ children }); }, []); - const syncRevenueCatState = useCallback(async (customerInfo: RevenueCatCustomerInfo) => { - applyRevenueCatCustomerInfoLocally(customerInfo); + const syncRevenueCatState = useCallback(async ( + customerInfo: RevenueCatCustomerInfo, + source: RevenueCatSyncSource = 'app_init', + ) => { + console.log('[Billing] Syncing RevenueCat customer info', { + source, + customerInfo: summarizeRevenueCatCustomerInfo(customerInfo), + }); + applyRevenueCatCustomerInfoLocally(customerInfo, source); try { - const response = await backendApiClient.syncRevenueCatState({ customerInfo }); + const response = await backendApiClient.syncRevenueCatState({ customerInfo, source }); setBillingSummary(response.billing); return response.billing; } catch (error) { diff --git a/docker-compose.yml b/docker-compose.yml index 4089e19..acf60cc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,54 +1,111 @@ -version: '3.8' - -services: - server: - build: - context: ./server - ports: - - "${PORT:-3005}:3000" - environment: - PORT: 3000 - PLANT_DB_PATH: /data/greenlns.sqlite - MINIO_ENDPOINT: minio - MINIO_PORT: 9000 - MINIO_USE_SSL: "false" - MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin} - MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin123} - MINIO_BUCKET: ${MINIO_BUCKET:-plant-images} - # Public URL for MinIO — set this to your Railway MinIO public domain - MINIO_PUBLIC_URL: ${MINIO_PUBLIC_URL:-http://localhost:9000} - # App secrets (set via Railway env vars) - OPENAI_API_KEY: ${OPENAI_API_KEY} - STRIPE_SECRET_KEY: ${STRIPE_SECRET_KEY} - STRIPE_PUBLISHABLE_KEY: ${STRIPE_PUBLISHABLE_KEY} - STRIPE_WEBHOOK_SECRET: ${STRIPE_WEBHOOK_SECRET} - JWT_SECRET: ${JWT_SECRET} - PLANT_IMPORT_ADMIN_KEY: ${PLANT_IMPORT_ADMIN_KEY} - volumes: - - db_data:/data - depends_on: - minio: - condition: service_healthy - restart: unless-stopped - - minio: - image: minio/minio:latest - ports: - - "9000:9000" - - "9001:9001" - environment: - MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin} - MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-minioadmin123} - volumes: - - minio_data:/data - command: server /data --console-address ":9001" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] - interval: 10s - timeout: 5s - retries: 5 - restart: unless-stopped - -volumes: - db_data: - minio_data: +services: + caddy: + image: caddy:2.8-alpine + restart: unless-stopped + ports: + - "80:80" + - "443:443" + environment: + SITE_DOMAIN: ${SITE_DOMAIN:-greenlenspro.com} + volumes: + - ./greenlns-landing/Caddyfile:/etc/caddy/Caddyfile:ro + - caddy_data:/data + - caddy_config:/config + depends_on: + landing: + condition: service_started + api: + condition: service_healthy + + landing: + build: + context: ./greenlns-landing + dockerfile: Dockerfile + restart: unless-stopped + environment: + NODE_ENV: production + PORT: 3000 + NEXT_PUBLIC_SITE_URL: ${SITE_URL:-https://greenlenspro.com} + healthcheck: + test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] + interval: 15s + timeout: 5s + retries: 5 + + api: + build: + context: . + dockerfile: server/Dockerfile + restart: unless-stopped + environment: + NODE_ENV: production + PORT: 3000 + DATABASE_URL: postgresql://${POSTGRES_USER:-greenlns}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@postgres:5432/${POSTGRES_DB:-greenlns} + POSTGRES_HOST: postgres + POSTGRES_PORT: 5432 + POSTGRES_DB: ${POSTGRES_DB:-greenlns} + POSTGRES_USER: ${POSTGRES_USER:-greenlns} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} + MINIO_ENDPOINT: minio + MINIO_PORT: 9000 + MINIO_USE_SSL: "false" + MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-greenlns-minio} + MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:?MINIO_SECRET_KEY is required} + MINIO_BUCKET: ${MINIO_BUCKET:-plant-images} + MINIO_PUBLIC_URL: ${MINIO_PUBLIC_URL:-https://greenlenspro.com/storage} + OPENAI_API_KEY: ${OPENAI_API_KEY:-} + OPENAI_SCAN_MODEL: ${OPENAI_SCAN_MODEL:-gpt-5-mini} + OPENAI_HEALTH_MODEL: ${OPENAI_HEALTH_MODEL:-gpt-5-mini} + STRIPE_SECRET_KEY: ${STRIPE_SECRET_KEY:-} + STRIPE_PUBLISHABLE_KEY: ${STRIPE_PUBLISHABLE_KEY:-} + STRIPE_WEBHOOK_SECRET: ${STRIPE_WEBHOOK_SECRET:-} + REVENUECAT_WEBHOOK_SECRET: ${REVENUECAT_WEBHOOK_SECRET:-} + REVENUECAT_PRO_ENTITLEMENT_ID: ${REVENUECAT_PRO_ENTITLEMENT_ID:-pro} + JWT_SECRET: ${JWT_SECRET:?JWT_SECRET is required} + PLANT_IMPORT_ADMIN_KEY: ${PLANT_IMPORT_ADMIN_KEY:-} + depends_on: + postgres: + condition: service_healthy + minio: + condition: service_healthy + healthcheck: + test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000/health').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] + interval: 15s + timeout: 5s + retries: 5 + + postgres: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_DB: ${POSTGRES_DB:-greenlns} + POSTGRES_USER: ${POSTGRES_USER:-greenlns} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} + volumes: + - postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] + interval: 10s + timeout: 5s + retries: 5 + + minio: + image: minio/minio:latest + restart: unless-stopped + environment: + MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-greenlns-minio} + MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:?MINIO_SECRET_KEY is required} + command: server /data + volumes: + - minio_data:/data + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + caddy_config: + caddy_data: + minio_data: + postgres_data: diff --git a/eas.json b/eas.json index 28fb7e8..f9d6a79 100644 --- a/eas.json +++ b/eas.json @@ -8,29 +8,29 @@ "developmentClient": true, "distribution": "internal" }, - "preview": { - "node": "22.18.0", - "distribution": "internal", - "env": { - "NPM_CONFIG_LEGACY_PEER_DEPS": "true", - "EXPO_PUBLIC_BACKEND_URL": "https://imaginative-abundance-production-f785.up.railway.app", - "EXPO_PUBLIC_PAYMENT_SERVER_URL": "https://imaginative-abundance-production-f785.up.railway.app", - "EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY": "pk_live_51SHpSLJYShvDMH3vXGaCFTgSDBZmjLUuw12rcvZFPwxfdEK1zRGG5mXFTMs6vMkgp7Udj07eZPDTNijhQn29VYpe00gzX8pBKN", - "EXPO_PUBLIC_REVENUECAT_IOS_API_KEY": "appl_hrjmLmIUUTojZygbsisNqQqrHbX" - } - }, - "production": { - "node": "22.18.0", - "env": { - "NPM_CONFIG_LEGACY_PEER_DEPS": "true", - "EXPO_PUBLIC_BACKEND_URL": "https://imaginative-abundance-production-f785.up.railway.app", - "EXPO_PUBLIC_PAYMENT_SERVER_URL": "https://imaginative-abundance-production-f785.up.railway.app", - "EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY": "pk_live_51SHpSLJYShvDMH3vXGaCFTgSDBZmjLUuw12rcvZFPwxfdEK1zRGG5mXFTMs6vMkgp7Udj07eZPDTNijhQn29VYpe00gzX8pBKN", - "EXPO_PUBLIC_REVENUECAT_IOS_API_KEY": "appl_hrjmLmIUUTojZygbsisNqQqrHbX" - } + "preview": { + "node": "22.18.0", + "distribution": "internal", + "env": { + "NPM_CONFIG_LEGACY_PEER_DEPS": "true", + "EXPO_PUBLIC_BACKEND_URL": "https://greenlenspro.com", + "EXPO_PUBLIC_PAYMENT_SERVER_URL": "https://greenlenspro.com", + "EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY": "pk_live_51SHpSLJYShvDMH3vXGaCFTgSDBZmjLUuw12rcvZFPwxfdEK1zRGG5mXFTMs6vMkgp7Udj07eZPDTNijhQn29VYpe00gzX8pBKN", + "EXPO_PUBLIC_REVENUECAT_IOS_API_KEY": "appl_hrjmLmIUUTojZygbsisNqQqrHbX" + } + }, + "production": { + "node": "22.18.0", + "env": { + "NPM_CONFIG_LEGACY_PEER_DEPS": "true", + "EXPO_PUBLIC_BACKEND_URL": "https://greenlenspro.com", + "EXPO_PUBLIC_PAYMENT_SERVER_URL": "https://greenlenspro.com", + "EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY": "pk_live_51SHpSLJYShvDMH3vXGaCFTgSDBZmjLUuw12rcvZFPwxfdEK1zRGG5mXFTMs6vMkgp7Udj07eZPDTNijhQn29VYpe00gzX8pBKN", + "EXPO_PUBLIC_REVENUECAT_IOS_API_KEY": "appl_hrjmLmIUUTojZygbsisNqQqrHbX" + } } }, "submit": { "production": {} } -} \ No newline at end of file +} diff --git a/greenlns-landing/Caddyfile b/greenlns-landing/Caddyfile new file mode 100644 index 0000000..074e386 --- /dev/null +++ b/greenlns-landing/Caddyfile @@ -0,0 +1,18 @@ +{$SITE_DOMAIN} { + encode zstd gzip + + @storage path /storage /storage/* + handle @storage { + uri strip_prefix /storage + reverse_proxy minio:9000 + } + + @api path /api /api/* /auth /auth/* /v1 /v1/* /health /plants /plants/* + handle @api { + reverse_proxy api:3000 + } + + handle { + reverse_proxy landing:3000 + } +} diff --git a/greenlns-landing/README.md b/greenlns-landing/README.md index cf26081..8b21865 100644 --- a/greenlns-landing/README.md +++ b/greenlns-landing/README.md @@ -1,36 +1,41 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). - -## Getting Started - -First, run the development server: - -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. - -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! - -## Deploy on Vercel - -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +# GreenLens Landing + +Self-hosted Next.js landing page for GreenLens. The production stack in this directory runs: + +- `caddy` for TLS and reverse proxy +- `landing` for the Next.js standalone app +- `api` for the Express backend from `../server` +- `postgres` for persistent app data +- `minio` for object storage under `/storage/*` + +## Local development + +```bash +npm install +npm run dev +``` + +## Production stack + +From `greenlns-landing/docker-compose.yml`: + +```bash +docker compose up --build -d +``` + +Required environment variables: + +- `SITE_DOMAIN` +- `SITE_URL` +- `POSTGRES_PASSWORD` +- `JWT_SECRET` +- `MINIO_SECRET_KEY` + +Optional service secrets: + +- `OPENAI_API_KEY` +- `STRIPE_SECRET_KEY` +- `STRIPE_PUBLISHABLE_KEY` +- `STRIPE_WEBHOOK_SECRET` +- `REVENUECAT_WEBHOOK_SECRET` +- `PLANT_IMPORT_ADMIN_KEY` diff --git a/greenlns-landing/app/robots.ts b/greenlns-landing/app/robots.ts new file mode 100644 index 0000000..baa1ba4 --- /dev/null +++ b/greenlns-landing/app/robots.ts @@ -0,0 +1,13 @@ +import { MetadataRoute } from 'next' + +export default function robots(): MetadataRoute.Robots { + const baseUrl = (process.env.NEXT_PUBLIC_SITE_URL || 'https://greenlenspro.com').trim() + + return { + rules: { + userAgent: '*', + allow: '/', + }, + sitemap: `${baseUrl}/sitemap.xml`, + } +} diff --git a/greenlns-landing/app/sitemap.ts b/greenlns-landing/app/sitemap.ts index 8b57aaf..b4f9552 100644 --- a/greenlns-landing/app/sitemap.ts +++ b/greenlns-landing/app/sitemap.ts @@ -1,10 +1,10 @@ -import { MetadataRoute } from 'next' - -export default function sitemap(): MetadataRoute.Sitemap { - const baseUrl = 'https://greenlns-landing.vercel.app' - - return [ - { +import { MetadataRoute } from 'next' + +export default function sitemap(): MetadataRoute.Sitemap { + const baseUrl = (process.env.NEXT_PUBLIC_SITE_URL || 'https://greenlenspro.com').trim() + + return [ + { url: baseUrl, lastModified: new Date(), changeFrequency: 'weekly', @@ -16,11 +16,17 @@ export default function sitemap(): MetadataRoute.Sitemap { changeFrequency: 'monthly', priority: 0.3, }, - { - url: `${baseUrl}/privacy`, - lastModified: new Date(), - changeFrequency: 'monthly', - priority: 0.3, - }, - ] -} + { + url: `${baseUrl}/privacy`, + lastModified: new Date(), + changeFrequency: 'monthly', + priority: 0.3, + }, + { + url: `${baseUrl}/terms`, + lastModified: new Date(), + changeFrequency: 'monthly', + priority: 0.3, + }, + ] +} diff --git a/greenlns-landing/app/terms/page.tsx b/greenlns-landing/app/terms/page.tsx index eeab14a..ca2d0e4 100644 --- a/greenlns-landing/app/terms/page.tsx +++ b/greenlns-landing/app/terms/page.tsx @@ -6,60 +6,24 @@ import { siteConfig } from '@/lib/site' const CONTENT = { de: { title: 'Nutzungsbedingungen', - intro: - 'Durch die Nutzung von GreenLens stimmst du diesen Nutzungsbedingungen zu. Bitte lies sie sorgfaeltig durch.', - section1: '1. Leistungen', - text1: - 'GreenLens bietet KI-gestuetzte Pflanzenidentifikation, Gesundheitsdiagnosen und Pflegeerinnerungen. Die App kann kostenlos genutzt werden; erweiterte Funktionen erfordern ein Abonnement oder Credits.', - section2: '2. Abonnements und In-App-Kaeufe', - text2: - 'GreenLens Pro ist ein automatisch erneuerbares Abonnement (monatlich oder jaehrlich). Es wird ueber deinen Apple-Account abgerechnet. Die Verlaengerung erfolgt automatisch, sofern du nicht mindestens 24 Stunden vor Ablauf des Abrechnungszeitraums kuendigst. Credits sind einmalige Kaeufe und nicht uebertragbar.', - section3: '3. Kuendigung', - text3: - 'Du kannst dein Abonnement jederzeit in den iPhone-Einstellungen unter deinem Apple-ID-Konto kuendigen. Nach der Kuendigung behast du den Zugriff bis zum Ende des bezahlten Zeitraums.', - section4: '4. Haftungsausschluss', - text4: - 'GreenLens stellt Informationen auf Basis von KI-Analysen bereit. Diese ersetzen keine professionelle Beratung. Wir uebernehmen keine Haftung fuer Schaeden, die durch die Nutzung der App entstehen.', - section5: '5. Kontakt', - text5: 'Bei Fragen zu diesen Nutzungsbedingungen erreichst du uns per E-Mail.', + intro: 'Diese Bedingungen regeln die Nutzung von GreenLens und der dazugehoerigen Services.', + section1: 'GreenLens wird als digitale App und Web-Service fuer Pflanzenscans, Informationen und accountbezogene Funktionen bereitgestellt.', + section2: 'Vor dem Livegang muessen diese Bedingungen durch rechtlich gepruefte und vollstaendige Vertragstexte ersetzt werden.', + contactLabel: 'Kontakt', }, en: { - title: 'Terms of Use', - intro: - 'By using GreenLens, you agree to these Terms of Use. Please read them carefully.', - section1: '1. Services', - text1: - 'GreenLens provides AI-powered plant identification, health diagnosis, and care reminders. The app is free to use; advanced features require a subscription or credits.', - section2: '2. Subscriptions and In-App Purchases', - text2: - 'GreenLens Pro is an auto-renewable subscription (monthly or yearly). Payment is charged to your Apple Account. Your subscription automatically renews unless cancelled at least 24 hours before the end of the current billing period. Credits are one-time purchases and are non-transferable.', - section3: '3. Cancellation', - text3: - 'You can cancel your subscription at any time in iPhone Settings under your Apple ID account. After cancellation, you retain access until the end of the paid period.', - section4: '4. Disclaimer', - text4: - 'GreenLens provides information based on AI analysis. This does not replace professional advice. We accept no liability for damages arising from use of the app.', - section5: '5. Contact', - text5: 'If you have questions about these Terms of Use, contact us by email.', + title: 'Terms of Service', + intro: 'These terms govern the use of GreenLens and its related services.', + section1: 'GreenLens is provided as a digital app and web service for plant scans, information, and account-related functionality.', + section2: 'Before launch, replace this placeholder with legally reviewed and complete terms for your business.', + contactLabel: 'Contact', }, es: { - title: 'Terminos de Uso', - intro: - 'Al usar GreenLens, aceptas estos Terminos de Uso. Por favor, leelos detenidamente.', - section1: '1. Servicios', - text1: - 'GreenLens ofrece identificacion de plantas, diagnostico de salud y recordatorios de cuidado basados en IA. La app es gratuita; las funciones avanzadas requieren una suscripcion o creditos.', - section2: '2. Suscripciones y Compras', - text2: - 'GreenLens Pro es una suscripcion de renovacion automatica (mensual o anual). El pago se carga a tu cuenta de Apple. La suscripcion se renueva automaticamente salvo que la canceles al menos 24 horas antes del final del periodo actual. Los creditos son compras unicas y no son transferibles.', - section3: '3. Cancelacion', - text3: - 'Puedes cancelar tu suscripcion en cualquier momento en los Ajustes del iPhone bajo tu cuenta de Apple ID. Tras la cancelacion, conservas el acceso hasta el final del periodo pagado.', - section4: '4. Exencion de responsabilidad', - text4: - 'GreenLens proporciona informacion basada en analisis de IA. Esto no reemplaza el asesoramiento profesional. No aceptamos responsabilidad por danos derivados del uso de la app.', - section5: '5. Contacto', - text5: 'Si tienes preguntas sobre estos Terminos de Uso, contactanos por correo electronico.', + title: 'Terminos del Servicio', + intro: 'Estos terminos regulan el uso de GreenLens y sus servicios relacionados.', + section1: 'GreenLens se ofrece como app y servicio web para escaneo de plantas, informacion y funciones de cuenta.', + section2: 'Antes del lanzamiento, sustituye este texto por terminos completos revisados legalmente.', + contactLabel: 'Contacto', }, } @@ -72,18 +36,10 @@ export default function TermsPage() {

{c.title}

{c.intro}

-

{c.section1}

-

{c.text1}

-

{c.section2}

-

{c.text2}

-

{c.section3}

-

{c.text3}

-

{c.section4}

-

{c.text4}

-

{c.section5}

-

{c.text5}

-

- {siteConfig.legalEmail} +

{c.section1}

+

{c.section2}

+

+ {c.contactLabel}: {siteConfig.legalEmail}

diff --git a/greenlns-landing/docker-compose.yml b/greenlns-landing/docker-compose.yml index f005199..536ca52 100644 --- a/greenlns-landing/docker-compose.yml +++ b/greenlns-landing/docker-compose.yml @@ -1,66 +1,111 @@ -version: '3.8' - -services: - app: - build: - context: . - environment: - NODE_ENV: production - restart: unless-stopped - depends_on: - postgres: - condition: service_healthy - minio: - condition: service_healthy - - postgres: - image: postgres:16-alpine - environment: - POSTGRES_DB: ${POSTGRES_DB:-GreenLens} - POSTGRES_USER: ${POSTGRES_USER:-GreenLens} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} - volumes: - - postgres_data:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-GreenLens}"] - interval: 10s - timeout: 5s - retries: 5 - restart: unless-stopped - # Expose to Railway/external — set firewall rules on your server! - ports: - - "5432:5432" - - minio: - image: minio/minio:latest - environment: - MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:?MINIO_ACCESS_KEY is required} - MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:?MINIO_SECRET_KEY is required} - volumes: - - minio_data:/data - command: server /data --console-address ":9001" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] - interval: 10s - timeout: 5s - retries: 5 - restart: unless-stopped - - nginx: - image: nginx:alpine - ports: - - "80:80" - - "443:443" - - "9000:9000" - - "9001:9001" - volumes: - - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro - - ./nginx/certs:/etc/nginx/certs:ro - depends_on: - - app - - minio - restart: unless-stopped - -volumes: - postgres_data: - minio_data: +services: + caddy: + image: caddy:2.8-alpine + restart: unless-stopped + ports: + - "80:80" + - "443:443" + environment: + SITE_DOMAIN: ${SITE_DOMAIN:-greenlenspro.com} + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile:ro + - caddy_data:/data + - caddy_config:/config + depends_on: + landing: + condition: service_started + api: + condition: service_healthy + + landing: + build: + context: . + dockerfile: Dockerfile + restart: unless-stopped + environment: + NODE_ENV: production + PORT: 3000 + NEXT_PUBLIC_SITE_URL: ${SITE_URL:-https://greenlenspro.com} + healthcheck: + test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] + interval: 15s + timeout: 5s + retries: 5 + + api: + build: + context: ../server + dockerfile: Dockerfile + restart: unless-stopped + environment: + NODE_ENV: production + PORT: 3000 + DATABASE_URL: postgresql://${POSTGRES_USER:-greenlns}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@postgres:5432/${POSTGRES_DB:-greenlns} + POSTGRES_HOST: postgres + POSTGRES_PORT: 5432 + POSTGRES_DB: ${POSTGRES_DB:-greenlns} + POSTGRES_USER: ${POSTGRES_USER:-greenlns} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} + MINIO_ENDPOINT: minio + MINIO_PORT: 9000 + MINIO_USE_SSL: "false" + MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-greenlns-minio} + MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:?MINIO_SECRET_KEY is required} + MINIO_BUCKET: ${MINIO_BUCKET:-plant-images} + MINIO_PUBLIC_URL: ${MINIO_PUBLIC_URL:-https://greenlenspro.com/storage} + OPENAI_API_KEY: ${OPENAI_API_KEY:-} + OPENAI_SCAN_MODEL: ${OPENAI_SCAN_MODEL:-gpt-5-mini} + OPENAI_HEALTH_MODEL: ${OPENAI_HEALTH_MODEL:-gpt-5-mini} + STRIPE_SECRET_KEY: ${STRIPE_SECRET_KEY:-} + STRIPE_PUBLISHABLE_KEY: ${STRIPE_PUBLISHABLE_KEY:-} + STRIPE_WEBHOOK_SECRET: ${STRIPE_WEBHOOK_SECRET:-} + REVENUECAT_WEBHOOK_SECRET: ${REVENUECAT_WEBHOOK_SECRET:-} + REVENUECAT_PRO_ENTITLEMENT_ID: ${REVENUECAT_PRO_ENTITLEMENT_ID:-pro} + JWT_SECRET: ${JWT_SECRET:?JWT_SECRET is required} + PLANT_IMPORT_ADMIN_KEY: ${PLANT_IMPORT_ADMIN_KEY:-} + depends_on: + postgres: + condition: service_healthy + minio: + condition: service_healthy + healthcheck: + test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000/health').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"] + interval: 15s + timeout: 5s + retries: 5 + + postgres: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_DB: ${POSTGRES_DB:-greenlns} + POSTGRES_USER: ${POSTGRES_USER:-greenlns} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} + volumes: + - postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] + interval: 10s + timeout: 5s + retries: 5 + + minio: + image: minio/minio:latest + restart: unless-stopped + environment: + MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-greenlns-minio} + MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:?MINIO_SECRET_KEY is required} + command: server /data + volumes: + - minio_data:/data + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] + interval: 10s + timeout: 5s + retries: 5 + +volumes: + caddy_config: + caddy_data: + postgres_data: + minio_data: diff --git a/greenlns-landing/lib/site.ts b/greenlns-landing/lib/site.ts index 53033bd..93b4dca 100644 --- a/greenlns-landing/lib/site.ts +++ b/greenlns-landing/lib/site.ts @@ -1,8 +1,10 @@ -export const siteConfig = { - name: 'GreenLens', - domain: 'https://greenlns-landing.vercel.app', - supportEmail: 'knuth.timo@gmail.com', - legalEmail: 'knuth.timo@gmail.com', +const siteUrl = (process.env.NEXT_PUBLIC_SITE_URL || 'https://greenlenspro.com').trim() + +export const siteConfig = { + name: 'GreenLens', + domain: siteUrl, + supportEmail: 'knuth.timo@gmail.com', + legalEmail: 'knuth.timo@gmail.com', iosAppStoreUrl: '', androidPlayStoreUrl: '', company: { diff --git a/greenlns-landing/next.config.ts b/greenlns-landing/next.config.ts index c243632..0c5afb5 100644 --- a/greenlns-landing/next.config.ts +++ b/greenlns-landing/next.config.ts @@ -1,10 +1,14 @@ -import type { NextConfig } from "next"; - -const nextConfig: NextConfig = { - output: 'standalone', - images: { - unoptimized: true, - }, -}; - -export default nextConfig; +import path from 'node:path' +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + output: 'standalone', + images: { + unoptimized: true, + }, + turbopack: { + root: path.join(__dirname), + }, +}; + +export default nextConfig; diff --git a/greenlns-landing/public/robots.txt b/greenlns-landing/public/robots.txt deleted file mode 100644 index 572e201..0000000 --- a/greenlns-landing/public/robots.txt +++ /dev/null @@ -1,4 +0,0 @@ -User-agent: * -Allow: / - -Sitemap: https://greenlns-landing.vercel.app/sitemap.xml diff --git a/railway.json b/railway.json index 1d3402a..6e08214 100644 --- a/railway.json +++ b/railway.json @@ -1,6 +1,6 @@ -{ - "$schema": "https://railway.app/railway.schema.json", - "deploy": { - "startCommand": "cd server && npm install && npm start" - } -} +{ + "$schema": "https://railway.app/railway.schema.json", + "deploy": { + "startCommand": "cd server && npm install && npm start" + } +} diff --git a/scripts/render_social_videos.js b/scripts/render_social_videos.js index 827f3fc..f600d0c 100644 --- a/scripts/render_social_videos.js +++ b/scripts/render_social_videos.js @@ -1,504 +1,504 @@ -const fs = require('fs'); -const fsp = fs.promises; -const http = require('http'); -const path = require('path'); -const { spawn } = require('child_process'); - -const ROOT = process.cwd(); -const RENDERER_PATH = path.join(ROOT, 'scripts', 'social-video-renderer.html'); -const OUTPUT_DIR = path.join(ROOT, 'generated', 'social-videos'); -const EDGE_DEBUG_PORT = Number(process.env.EDGE_DEBUG_PORT || '9222'); -const videos = [ - { - outputName: 'greenlens-yellow-leaves.webm', - accentA: '#143625', - accentB: '#3f855f', - scenes: [ - { - image: '/greenlns-landing/public/unhealthy-plant.png', - badge: 'Plant Rescue', - title: 'Why Are My Plant Leaves Turning Yellow?', - subtitle: 'Start with a scan instead of another random guess.', - cta: 'Save this for your next plant emergency', - durationMs: 2600, - }, - { - image: '/greenlns-landing/public/scan-feature.png', - badge: 'GreenLens', - title: 'Scan The Plant In Seconds', - subtitle: 'Get the plant name and a faster clue about what is going wrong.', - cta: 'Open the app and scan', - durationMs: 2600, - }, - { - image: '/greenlns-landing/public/ai-analysis.png', - badge: 'Care Help', - title: 'See The Likely Care Issue', - subtitle: 'Less guessing. Faster fixes. Better plant care.', - cta: 'Plant ID plus care guidance', - durationMs: 2600, - }, - { - image: '/greenlns-landing/public/plant-collection.png', - badge: 'Result', - title: 'Give Your Plant A Better Recovery Plan', - subtitle: 'GreenLens helps you move from panic to action.', - cta: 'GreenLens', - durationMs: 2400, - }, - ], - }, - { - outputName: 'greenlens-mystery-plant.webm', - accentA: '#18392b', - accentB: '#5ba174', - scenes: [ - { - image: '/greenlns-landing/public/hero-plant.png', - badge: 'Mystery Plant', - title: 'I Had This Plant For Months', - subtitle: 'And I still did not know what it was.', - cta: 'No more mystery plants', - durationMs: 2600, - }, - { - image: '/greenlns-landing/public/scan-feature.png', - badge: 'Scan', - title: 'Point. Scan. Identify.', - subtitle: 'Get the plant name in a few seconds with GreenLens.', - cta: 'Tap to scan', - durationMs: 2500, - }, - { - image: '/greenlns-landing/public/ai-analysis.png', - badge: 'Know More', - title: 'See The Species And Care Basics', - subtitle: 'That means less overwatering and fewer avoidable mistakes.', - cta: 'Plant ID and care basics', - durationMs: 2600, - }, - { - image: '/greenlns-landing/public/track-feature.png', - badge: 'Next Step', - title: 'Now You Can Actually Care For It Right', - subtitle: 'Knowing the name changes everything.', - cta: 'Comment for more plant scans', - durationMs: 2300, - }, - ], - }, - { - outputName: 'greenlens-plant-routine.webm', - accentA: '#102d21', - accentB: '#4f916d', - scenes: [ - { - image: '/greenlns-landing/public/plant-collection.png', - badge: 'POV', - title: 'You Love Plants But Forget Their Care Routine', - subtitle: 'Too many plants. Too many watering schedules.', - cta: 'Plant parent problems', - durationMs: 2700, - }, - { - image: '/greenlns-landing/public/track-feature.png', - badge: 'Tracking', - title: 'Keep Care Details In One Place', - subtitle: 'Watering, light needs, and reminders without mental overload.', - cta: 'Track care with GreenLens', - durationMs: 2600, - }, - { - image: '/greenlns-landing/public/scan-feature.png', - badge: 'Simple Start', - title: 'Scan First Then Build The Routine', - subtitle: 'A better system starts with a better plant ID.', - cta: 'Scan and track', - durationMs: 2500, - }, - { - image: '/greenlns-landing/public/hero-plant.png', - badge: 'Calmer Care', - title: 'Healthy Plants Need Fewer Guesswork Decisions', - subtitle: 'GreenLens makes plant care easier to manage.', - cta: 'Follow for more plant shortcuts', - durationMs: 2400, - }, - ], - }, - { - outputName: 'greenlens-sick-plant-rescue.webm', - accentA: '#1e2c18', - accentB: '#63844d', - scenes: [ - { - image: '/greenlns-landing/public/unhealthy-plant.png', - badge: 'Rescue', - title: 'This Plant Looked Like It Was Dying', - subtitle: 'The first move was not more water. It was a diagnosis.', - cta: 'Stop guessing first', - durationMs: 2700, - }, - { - image: '/greenlns-landing/public/scan-feature.png', - badge: 'Step 1', - title: 'Scan The Problem Plant', - subtitle: 'Use GreenLens to identify what you are actually dealing with.', - cta: 'Start with a scan', - durationMs: 2500, - }, - { - image: '/greenlns-landing/public/ai-analysis.png', - badge: 'Step 2', - title: 'Get Care Guidance Faster', - subtitle: 'Know whether the issue points to watering, light, or something else.', - cta: 'Faster plant triage', - durationMs: 2600, - }, - { - image: '/greenlns-landing/public/plant-collection.png', - badge: 'Step 3', - title: 'Turn Panic Into A Care Plan', - subtitle: 'A stressed plant needs informed action, not random fixes.', - cta: 'Send this to a plant parent', - durationMs: 2400, - }, - ], - }, - { - outputName: 'greenlens-fast-demo.webm', - accentA: '#183724', - accentB: '#56a074', - scenes: [ - { - image: '/greenlns-landing/public/scan-feature.png', - badge: 'Fast Demo', - title: 'Scan Any Plant In Seconds', - subtitle: 'GreenLens turns a quick camera scan into plant insight.', - cta: 'Simple plant ID', - durationMs: 2500, - }, - { - image: '/greenlns-landing/public/ai-analysis.png', - badge: 'AI', - title: 'See The Name And Care Guidance', - subtitle: 'Get plant details without digging through search results.', - cta: 'Plant ID plus help', - durationMs: 2600, - }, - { - image: '/greenlns-landing/public/track-feature.png', - badge: 'Routine', - title: 'Track Care After The Scan', - subtitle: 'Keep watering and plant health details organized.', - cta: 'Track what matters', - durationMs: 2400, - }, - { - image: '/greenlns-landing/public/hero-plant.png', - badge: 'GreenLens', - title: 'Plant ID And Care Help In One App', - subtitle: 'Use it on your next mystery plant.', - cta: 'GreenLens', - durationMs: 2400, - }, - ], - }, -]; - -async function ensureDir(dir) { - await fsp.mkdir(dir, { recursive: true }); -} - -function contentType(filePath) { - const ext = path.extname(filePath).toLowerCase(); - if (ext === '.html') return 'text/html; charset=utf-8'; - if (ext === '.png') return 'image/png'; - if (ext === '.jpg' || ext === '.jpeg') return 'image/jpeg'; - if (ext === '.webm') return 'video/webm'; - if (ext === '.mp4') return 'video/mp4'; - if (ext === '.svg') return 'image/svg+xml'; - return 'application/octet-stream'; -} - -async function startServer() { - await ensureDir(OUTPUT_DIR); - const server = http.createServer(async (req, res) => { - try { - const url = new URL(req.url, 'http://127.0.0.1'); - if (req.method === 'POST' && url.pathname === '/upload') { - const name = path.basename(url.searchParams.get('name') || 'output.webm'); - const target = path.join(OUTPUT_DIR, name); - const chunks = []; - req.on('data', (chunk) => chunks.push(chunk)); - req.on('end', async () => { - await fsp.writeFile(target, Buffer.concat(chunks)); - res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); - res.end(target); - }); - return; - } - - let filePath; - if (url.pathname === '/renderer') { - filePath = RENDERER_PATH; - } else { - filePath = path.join(ROOT, decodeURIComponent(url.pathname.replace(/^\/+/, ''))); - } - - const normalized = path.normalize(filePath); - if (!normalized.startsWith(ROOT)) { - res.writeHead(403); - res.end('Forbidden'); - return; - } - - const data = await fsp.readFile(normalized); - res.writeHead(200, { 'Content-Type': contentType(normalized) }); - res.end(data); - } catch (error) { - res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' }); - res.end(String(error)); - } - }); - - await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); - const address = server.address(); - return { server, port: address.port }; -} - -async function fetchJson(url, retries = 60) { - let lastError; - for (let attempt = 0; attempt < retries; attempt += 1) { - try { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`HTTP ${response.status}`); - } - return response.json(); - } catch (error) { - lastError = error; - await new Promise((resolve) => setTimeout(resolve, 250)); - } - } - throw lastError; -} - -async function waitForPageReady(sessionSend, retries = 80) { - for (let attempt = 0; attempt < retries; attempt += 1) { - const result = await sessionSend('Runtime.evaluate', { - expression: 'document.readyState', - returnByValue: true, - }).catch(() => null); - - if (result && result.result && result.result.value === 'complete') { - return; - } - - await new Promise((resolve) => setTimeout(resolve, 250)); - } - - throw new Error('Timed out waiting for renderer page readiness'); -} - -function runCommand(command, timeoutMs = 30000) { - return new Promise((resolve, reject) => { - const child = spawn( - 'C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', - ['-NoProfile', '-Command', command], - { stdio: ['ignore', 'pipe', 'pipe'] } - ); - - let stdout = ''; - let stderr = ''; - const timeout = setTimeout(() => { - child.kill(); - reject(new Error(`Command timed out: ${command}`)); - }, timeoutMs); - - child.stdout.on('data', (chunk) => { - stdout += chunk.toString(); - }); - child.stderr.on('data', (chunk) => { - stderr += chunk.toString(); - }); - - child.on('exit', (code) => { - clearTimeout(timeout); - if (code === 0) { - resolve(stdout.trim()); - } else { - reject(new Error(stderr || stdout || `Command failed with code ${code}`)); - } - }); - }); -} - -async function startEdge(profileDir) { - const escapedProfile = profileDir.replace(/'/g, "''"); - const command = [ - "$p = Start-Process -FilePath 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe'", - `-ArgumentList @('--headless','--disable-gpu','--no-sandbox','--disable-crash-reporter','--disable-breakpad','--noerrdialogs','--autoplay-policy=no-user-gesture-required','--mute-audio','--hide-scrollbars','--remote-debugging-port=${EDGE_DEBUG_PORT}',`, - `'--user-data-dir=${escapedProfile}','about:blank')`, - '-PassThru;', - 'Write-Output $p.Id', - ].join(' '); - const pidText = await runCommand(command, 30000); - return Number(pidText); -} - -async function stopEdge(pid) { - if (!pid) return; - await runCommand(`Stop-Process -Id ${pid} -Force -ErrorAction SilentlyContinue`, 15000).catch(() => {}); -} - -class CDPClient { - constructor(wsUrl) { - this.ws = new WebSocket(wsUrl); - this.id = 0; - this.pending = new Map(); - this.events = []; - this.waiters = []; - } - - async connect() { - await new Promise((resolve, reject) => { - this.ws.addEventListener('open', resolve, { once: true }); - this.ws.addEventListener('error', reject, { once: true }); - }); - - this.ws.addEventListener('message', (event) => { - const message = JSON.parse(event.data); - if (message.id) { - const pending = this.pending.get(message.id); - if (pending) { - this.pending.delete(message.id); - if (message.error) { - pending.reject(new Error(message.error.message)); - } else { - pending.resolve(message.result); - } - } - return; - } - - this.events.push(message); - this.waiters = this.waiters.filter((waiter) => { - if (waiter.predicate(message)) { - waiter.resolve(message); - return false; - } - return true; - }); - }); - } - - send(method, params = {}, sessionId) { - const id = ++this.id; - const message = sessionId - ? { id, method, params, sessionId } - : { id, method, params }; - this.ws.send(JSON.stringify(message)); - return new Promise((resolve, reject) => { - this.pending.set(id, { resolve, reject }); - }); - } - - waitFor(predicate, timeoutMs = 30000) { - const existing = this.events.find(predicate); - if (existing) { - return Promise.resolve(existing); - } - return new Promise((resolve, reject) => { - const timeout = setTimeout(() => { - this.waiters = this.waiters.filter((waiter) => waiter.resolve !== resolve); - reject(new Error('Timed out waiting for event')); - }, timeoutMs); - - this.waiters.push({ - predicate, - resolve: (message) => { - clearTimeout(timeout); - resolve(message); - }, - }); - }); - } - - close() { - this.ws.close(); - } -} - -async function run() { - await ensureDir(OUTPUT_DIR); - const profileDir = path.join(ROOT, '.edge-profile-render'); - const { server, port } = await startServer(); - const useExternalEdge = process.env.EDGE_EXTERNAL === '1'; - let edgePid = null; - - try { - console.log(`server:${port}`); - console.log(`externalEdge:${useExternalEdge}`); - if (!useExternalEdge) { - edgePid = await startEdge(profileDir); - } - console.log('fetching-devtools-version'); - const version = await fetchJson(`http://127.0.0.1:${EDGE_DEBUG_PORT}/json/version`); - console.log('devtools-version-ready'); - const client = new CDPClient(version.webSocketDebuggerUrl); - await client.connect(); - console.log('cdp-connected'); - - const { targetId } = await client.send('Target.createTarget', { - url: 'about:blank', - }); - console.log(`target:${targetId}`); - const { sessionId } = await client.send('Target.attachToTarget', { - targetId, - flatten: true, - }); - console.log(`session:${sessionId}`); - - const sessionSend = (method, params = {}) => - client.send(method, params, sessionId); - - await sessionSend('Page.enable'); - await sessionSend('Runtime.enable'); - await sessionSend('Page.navigate', { - url: `http://127.0.0.1:${port}/renderer`, - }); - await waitForPageReady(sessionSend); - - for (const video of videos) { - const payload = { - ...video, - logo: '/assets/icon.png', - fps: 30, - }; - - const expression = `window.renderVideo(${JSON.stringify(payload)})`; - const result = await sessionSend('Runtime.evaluate', { - expression, - awaitPromise: true, - returnByValue: true, - }); - - if (!result.result || !result.result.value) { - throw new Error(`Renderer did not return a file path for ${video.outputName}`); - } - } - - client.close(); - } finally { - if (!useExternalEdge) { - await stopEdge(edgePid); - } - server.close(); - } -} - -run().catch((error) => { - console.error(error); - process.exitCode = 1; -}); +const fs = require('fs'); +const fsp = fs.promises; +const http = require('http'); +const path = require('path'); +const { spawn } = require('child_process'); + +const ROOT = process.cwd(); +const RENDERER_PATH = path.join(ROOT, 'scripts', 'social-video-renderer.html'); +const OUTPUT_DIR = path.join(ROOT, 'generated', 'social-videos'); +const EDGE_DEBUG_PORT = Number(process.env.EDGE_DEBUG_PORT || '9222'); +const videos = [ + { + outputName: 'greenlens-yellow-leaves.webm', + accentA: '#143625', + accentB: '#3f855f', + scenes: [ + { + image: '/greenlns-landing/public/unhealthy-plant.png', + badge: 'Plant Rescue', + title: 'Why Are My Plant Leaves Turning Yellow?', + subtitle: 'Start with a scan instead of another random guess.', + cta: 'Save this for your next plant emergency', + durationMs: 2600, + }, + { + image: '/greenlns-landing/public/scan-feature.png', + badge: 'GreenLens', + title: 'Scan The Plant In Seconds', + subtitle: 'Get the plant name and a faster clue about what is going wrong.', + cta: 'Open the app and scan', + durationMs: 2600, + }, + { + image: '/greenlns-landing/public/ai-analysis.png', + badge: 'Care Help', + title: 'See The Likely Care Issue', + subtitle: 'Less guessing. Faster fixes. Better plant care.', + cta: 'Plant ID plus care guidance', + durationMs: 2600, + }, + { + image: '/greenlns-landing/public/plant-collection.png', + badge: 'Result', + title: 'Give Your Plant A Better Recovery Plan', + subtitle: 'GreenLens helps you move from panic to action.', + cta: 'GreenLens', + durationMs: 2400, + }, + ], + }, + { + outputName: 'greenlens-mystery-plant.webm', + accentA: '#18392b', + accentB: '#5ba174', + scenes: [ + { + image: '/greenlns-landing/public/hero-plant.png', + badge: 'Mystery Plant', + title: 'I Had This Plant For Months', + subtitle: 'And I still did not know what it was.', + cta: 'No more mystery plants', + durationMs: 2600, + }, + { + image: '/greenlns-landing/public/scan-feature.png', + badge: 'Scan', + title: 'Point. Scan. Identify.', + subtitle: 'Get the plant name in a few seconds with GreenLens.', + cta: 'Tap to scan', + durationMs: 2500, + }, + { + image: '/greenlns-landing/public/ai-analysis.png', + badge: 'Know More', + title: 'See The Species And Care Basics', + subtitle: 'That means less overwatering and fewer avoidable mistakes.', + cta: 'Plant ID and care basics', + durationMs: 2600, + }, + { + image: '/greenlns-landing/public/track-feature.png', + badge: 'Next Step', + title: 'Now You Can Actually Care For It Right', + subtitle: 'Knowing the name changes everything.', + cta: 'Comment for more plant scans', + durationMs: 2300, + }, + ], + }, + { + outputName: 'greenlens-plant-routine.webm', + accentA: '#102d21', + accentB: '#4f916d', + scenes: [ + { + image: '/greenlns-landing/public/plant-collection.png', + badge: 'POV', + title: 'You Love Plants But Forget Their Care Routine', + subtitle: 'Too many plants. Too many watering schedules.', + cta: 'Plant parent problems', + durationMs: 2700, + }, + { + image: '/greenlns-landing/public/track-feature.png', + badge: 'Tracking', + title: 'Keep Care Details In One Place', + subtitle: 'Watering, light needs, and reminders without mental overload.', + cta: 'Track care with GreenLens', + durationMs: 2600, + }, + { + image: '/greenlns-landing/public/scan-feature.png', + badge: 'Simple Start', + title: 'Scan First Then Build The Routine', + subtitle: 'A better system starts with a better plant ID.', + cta: 'Scan and track', + durationMs: 2500, + }, + { + image: '/greenlns-landing/public/hero-plant.png', + badge: 'Calmer Care', + title: 'Healthy Plants Need Fewer Guesswork Decisions', + subtitle: 'GreenLens makes plant care easier to manage.', + cta: 'Follow for more plant shortcuts', + durationMs: 2400, + }, + ], + }, + { + outputName: 'greenlens-sick-plant-rescue.webm', + accentA: '#1e2c18', + accentB: '#63844d', + scenes: [ + { + image: '/greenlns-landing/public/unhealthy-plant.png', + badge: 'Rescue', + title: 'This Plant Looked Like It Was Dying', + subtitle: 'The first move was not more water. It was a diagnosis.', + cta: 'Stop guessing first', + durationMs: 2700, + }, + { + image: '/greenlns-landing/public/scan-feature.png', + badge: 'Step 1', + title: 'Scan The Problem Plant', + subtitle: 'Use GreenLens to identify what you are actually dealing with.', + cta: 'Start with a scan', + durationMs: 2500, + }, + { + image: '/greenlns-landing/public/ai-analysis.png', + badge: 'Step 2', + title: 'Get Care Guidance Faster', + subtitle: 'Know whether the issue points to watering, light, or something else.', + cta: 'Faster plant triage', + durationMs: 2600, + }, + { + image: '/greenlns-landing/public/plant-collection.png', + badge: 'Step 3', + title: 'Turn Panic Into A Care Plan', + subtitle: 'A stressed plant needs informed action, not random fixes.', + cta: 'Send this to a plant parent', + durationMs: 2400, + }, + ], + }, + { + outputName: 'greenlens-fast-demo.webm', + accentA: '#183724', + accentB: '#56a074', + scenes: [ + { + image: '/greenlns-landing/public/scan-feature.png', + badge: 'Fast Demo', + title: 'Scan Any Plant In Seconds', + subtitle: 'GreenLens turns a quick camera scan into plant insight.', + cta: 'Simple plant ID', + durationMs: 2500, + }, + { + image: '/greenlns-landing/public/ai-analysis.png', + badge: 'AI', + title: 'See The Name And Care Guidance', + subtitle: 'Get plant details without digging through search results.', + cta: 'Plant ID plus help', + durationMs: 2600, + }, + { + image: '/greenlns-landing/public/track-feature.png', + badge: 'Routine', + title: 'Track Care After The Scan', + subtitle: 'Keep watering and plant health details organized.', + cta: 'Track what matters', + durationMs: 2400, + }, + { + image: '/greenlns-landing/public/hero-plant.png', + badge: 'GreenLens', + title: 'Plant ID And Care Help In One App', + subtitle: 'Use it on your next mystery plant.', + cta: 'GreenLens', + durationMs: 2400, + }, + ], + }, +]; + +async function ensureDir(dir) { + await fsp.mkdir(dir, { recursive: true }); +} + +function contentType(filePath) { + const ext = path.extname(filePath).toLowerCase(); + if (ext === '.html') return 'text/html; charset=utf-8'; + if (ext === '.png') return 'image/png'; + if (ext === '.jpg' || ext === '.jpeg') return 'image/jpeg'; + if (ext === '.webm') return 'video/webm'; + if (ext === '.mp4') return 'video/mp4'; + if (ext === '.svg') return 'image/svg+xml'; + return 'application/octet-stream'; +} + +async function startServer() { + await ensureDir(OUTPUT_DIR); + const server = http.createServer(async (req, res) => { + try { + const url = new URL(req.url, 'http://127.0.0.1'); + if (req.method === 'POST' && url.pathname === '/upload') { + const name = path.basename(url.searchParams.get('name') || 'output.webm'); + const target = path.join(OUTPUT_DIR, name); + const chunks = []; + req.on('data', (chunk) => chunks.push(chunk)); + req.on('end', async () => { + await fsp.writeFile(target, Buffer.concat(chunks)); + res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); + res.end(target); + }); + return; + } + + let filePath; + if (url.pathname === '/renderer') { + filePath = RENDERER_PATH; + } else { + filePath = path.join(ROOT, decodeURIComponent(url.pathname.replace(/^\/+/, ''))); + } + + const normalized = path.normalize(filePath); + if (!normalized.startsWith(ROOT)) { + res.writeHead(403); + res.end('Forbidden'); + return; + } + + const data = await fsp.readFile(normalized); + res.writeHead(200, { 'Content-Type': contentType(normalized) }); + res.end(data); + } catch (error) { + res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' }); + res.end(String(error)); + } + }); + + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); + const address = server.address(); + return { server, port: address.port }; +} + +async function fetchJson(url, retries = 60) { + let lastError; + for (let attempt = 0; attempt < retries; attempt += 1) { + try { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + return response.json(); + } catch (error) { + lastError = error; + await new Promise((resolve) => setTimeout(resolve, 250)); + } + } + throw lastError; +} + +async function waitForPageReady(sessionSend, retries = 80) { + for (let attempt = 0; attempt < retries; attempt += 1) { + const result = await sessionSend('Runtime.evaluate', { + expression: 'document.readyState', + returnByValue: true, + }).catch(() => null); + + if (result && result.result && result.result.value === 'complete') { + return; + } + + await new Promise((resolve) => setTimeout(resolve, 250)); + } + + throw new Error('Timed out waiting for renderer page readiness'); +} + +function runCommand(command, timeoutMs = 30000) { + return new Promise((resolve, reject) => { + const child = spawn( + 'C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', + ['-NoProfile', '-Command', command], + { stdio: ['ignore', 'pipe', 'pipe'] } + ); + + let stdout = ''; + let stderr = ''; + const timeout = setTimeout(() => { + child.kill(); + reject(new Error(`Command timed out: ${command}`)); + }, timeoutMs); + + child.stdout.on('data', (chunk) => { + stdout += chunk.toString(); + }); + child.stderr.on('data', (chunk) => { + stderr += chunk.toString(); + }); + + child.on('exit', (code) => { + clearTimeout(timeout); + if (code === 0) { + resolve(stdout.trim()); + } else { + reject(new Error(stderr || stdout || `Command failed with code ${code}`)); + } + }); + }); +} + +async function startEdge(profileDir) { + const escapedProfile = profileDir.replace(/'/g, "''"); + const command = [ + "$p = Start-Process -FilePath 'C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe'", + `-ArgumentList @('--headless','--disable-gpu','--no-sandbox','--disable-crash-reporter','--disable-breakpad','--noerrdialogs','--autoplay-policy=no-user-gesture-required','--mute-audio','--hide-scrollbars','--remote-debugging-port=${EDGE_DEBUG_PORT}',`, + `'--user-data-dir=${escapedProfile}','about:blank')`, + '-PassThru;', + 'Write-Output $p.Id', + ].join(' '); + const pidText = await runCommand(command, 30000); + return Number(pidText); +} + +async function stopEdge(pid) { + if (!pid) return; + await runCommand(`Stop-Process -Id ${pid} -Force -ErrorAction SilentlyContinue`, 15000).catch(() => {}); +} + +class CDPClient { + constructor(wsUrl) { + this.ws = new WebSocket(wsUrl); + this.id = 0; + this.pending = new Map(); + this.events = []; + this.waiters = []; + } + + async connect() { + await new Promise((resolve, reject) => { + this.ws.addEventListener('open', resolve, { once: true }); + this.ws.addEventListener('error', reject, { once: true }); + }); + + this.ws.addEventListener('message', (event) => { + const message = JSON.parse(event.data); + if (message.id) { + const pending = this.pending.get(message.id); + if (pending) { + this.pending.delete(message.id); + if (message.error) { + pending.reject(new Error(message.error.message)); + } else { + pending.resolve(message.result); + } + } + return; + } + + this.events.push(message); + this.waiters = this.waiters.filter((waiter) => { + if (waiter.predicate(message)) { + waiter.resolve(message); + return false; + } + return true; + }); + }); + } + + send(method, params = {}, sessionId) { + const id = ++this.id; + const message = sessionId + ? { id, method, params, sessionId } + : { id, method, params }; + this.ws.send(JSON.stringify(message)); + return new Promise((resolve, reject) => { + this.pending.set(id, { resolve, reject }); + }); + } + + waitFor(predicate, timeoutMs = 30000) { + const existing = this.events.find(predicate); + if (existing) { + return Promise.resolve(existing); + } + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + this.waiters = this.waiters.filter((waiter) => waiter.resolve !== resolve); + reject(new Error('Timed out waiting for event')); + }, timeoutMs); + + this.waiters.push({ + predicate, + resolve: (message) => { + clearTimeout(timeout); + resolve(message); + }, + }); + }); + } + + close() { + this.ws.close(); + } +} + +async function run() { + await ensureDir(OUTPUT_DIR); + const profileDir = path.join(ROOT, '.edge-profile-render'); + const { server, port } = await startServer(); + const useExternalEdge = process.env.EDGE_EXTERNAL === '1'; + let edgePid = null; + + try { + console.log(`server:${port}`); + console.log(`externalEdge:${useExternalEdge}`); + if (!useExternalEdge) { + edgePid = await startEdge(profileDir); + } + console.log('fetching-devtools-version'); + const version = await fetchJson(`http://127.0.0.1:${EDGE_DEBUG_PORT}/json/version`); + console.log('devtools-version-ready'); + const client = new CDPClient(version.webSocketDebuggerUrl); + await client.connect(); + console.log('cdp-connected'); + + const { targetId } = await client.send('Target.createTarget', { + url: 'about:blank', + }); + console.log(`target:${targetId}`); + const { sessionId } = await client.send('Target.attachToTarget', { + targetId, + flatten: true, + }); + console.log(`session:${sessionId}`); + + const sessionSend = (method, params = {}) => + client.send(method, params, sessionId); + + await sessionSend('Page.enable'); + await sessionSend('Runtime.enable'); + await sessionSend('Page.navigate', { + url: `http://127.0.0.1:${port}/renderer`, + }); + await waitForPageReady(sessionSend); + + for (const video of videos) { + const payload = { + ...video, + logo: '/assets/icon.png', + fps: 30, + }; + + const expression = `window.renderVideo(${JSON.stringify(payload)})`; + const result = await sessionSend('Runtime.evaluate', { + expression, + awaitPromise: true, + returnByValue: true, + }); + + if (!result.result || !result.result.value) { + throw new Error(`Renderer did not return a file path for ${video.outputName}`); + } + } + + client.close(); + } finally { + if (!useExternalEdge) { + await stopEdge(edgePid); + } + server.close(); + } +} + +run().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/scripts/social-video-renderer.html b/scripts/social-video-renderer.html index 29628f0..bedb7bb 100644 --- a/scripts/social-video-renderer.html +++ b/scripts/social-video-renderer.html @@ -1,286 +1,286 @@ - - - - - - GreenLens Social Video Renderer - - - - - - - + + + + + + GreenLens Social Video Renderer + + + + + + + diff --git a/server/Dockerfile b/server/Dockerfile index 1ba6682..73e8094 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,12 +1,12 @@ -FROM node:20-alpine - -WORKDIR /app - -COPY package*.json ./ -RUN npm ci --only=production - -COPY . . - -EXPOSE 3000 - -CMD ["node", "index.js"] +FROM node:20-alpine + +WORKDIR /app + +COPY server/package*.json ./ +RUN npm ci --omit=dev + +COPY server/. . + +EXPOSE 3000 + +CMD ["node", "index.js"] diff --git a/server/index.js b/server/index.js index 09d272f..1b7b2d6 100644 --- a/server/index.js +++ b/server/index.js @@ -26,7 +26,7 @@ loadEnvFiles([ path.join(__dirname, '.env.local'), ]); -const { closeDatabase, getDefaultDbPath, openDatabase, get, run } = require('./lib/sqlite'); +const { closeDatabase, getDefaultDbPath, openDatabase, get } = require('./lib/postgres'); const { ensureAuthSchema, signUp: authSignUp, login: authLogin, issueToken, verifyJwt } = require('./lib/auth'); const { PlantImportValidationError, @@ -392,18 +392,31 @@ app.get('/', (_request, response) => { }); }); -app.get('/health', (_request, response) => { - const stripeSecret = (process.env.STRIPE_SECRET_KEY || '').trim(); - response.status(200).json({ - ok: true, - uptimeSec: Math.round(process.uptime()), - timestamp: new Date().toISOString(), - openAiConfigured: isOpenAiConfigured(), - dbReady: Boolean(db), - dbPath: getDefaultDbPath(), - stripeConfigured: Boolean(stripeSecret), - stripeMode: getStripeSecretMode(), - stripePublishableMode: getStripePublishableMode(), +const getDatabaseHealthTarget = () => { + const raw = getDefaultDbPath(); + if (!raw) return ''; + + try { + const parsed = new URL(raw); + const databaseName = parsed.pathname.replace(/^\//, ''); + return `${parsed.protocol}//${parsed.hostname}${parsed.port ? `:${parsed.port}` : ''}/${databaseName}`; + } catch { + return 'configured'; + } +}; + +app.get('/health', (_request, response) => { + const stripeSecret = (process.env.STRIPE_SECRET_KEY || '').trim(); + response.status(200).json({ + ok: true, + uptimeSec: Math.round(process.uptime()), + timestamp: new Date().toISOString(), + openAiConfigured: isOpenAiConfigured(), + dbReady: Boolean(db), + dbPath: getDatabaseHealthTarget(), + stripeConfigured: Boolean(stripeSecret), + stripeMode: getStripeSecretMode(), + stripePublishableMode: getStripePublishableMode(), scanModel: getScanModel(), healthModel: getHealthModel(), }); @@ -500,12 +513,12 @@ app.post('/api/payment-sheet', async (request, response) => { app.get('/v1/billing/summary', async (request, response) => { try { - const userId = ensureRequestAuth(request); - if (userId !== 'guest') { - const userExists = await get(db, 'SELECT id FROM auth_users WHERE id = ?', [userId]); - if (!userExists) { - return response.status(401).json({ code: 'UNAUTHORIZED', message: 'User not found.' }); - } + const userId = ensureRequestAuth(request); + if (userId !== 'guest') { + const userExists = await get(db, 'SELECT id FROM auth_users WHERE id = $1', [userId]); + if (!userExists) { + return response.status(401).json({ code: 'UNAUTHORIZED', message: 'User not found.' }); + } } const summary = await getBillingSummary(db, userId); response.status(200).json(summary); @@ -522,10 +535,11 @@ app.post('/v1/billing/sync-revenuecat', async (request, response) => { return response.status(400).json({ code: 'BAD_REQUEST', message: 'Guest users cannot sync RevenueCat state.' }); } const customerInfo = request.body?.customerInfo; + const source = typeof request.body?.source === 'string' ? request.body.source : undefined; if (!customerInfo || typeof customerInfo !== 'object' || !customerInfo.entitlements) { return response.status(400).json({ code: 'BAD_REQUEST', message: 'customerInfo is required.' }); } - const payload = await syncRevenueCatCustomerInfo(db, userId, customerInfo); + const payload = await syncRevenueCatCustomerInfo(db, userId, customerInfo, { source }); response.status(200).json(payload); } catch (error) { const payload = toApiErrorPayload(error); diff --git a/server/lib/auth.js b/server/lib/auth.js index e1a03a1..4a9d163 100644 --- a/server/lib/auth.js +++ b/server/lib/auth.js @@ -1,5 +1,5 @@ const crypto = require('crypto'); -const { get, run } = require('./sqlite'); +const { get, run } = require('./postgres'); const JWT_SECRET = process.env.JWT_SECRET || 'greenlens-dev-secret-change-in-prod'; const TOKEN_EXPIRY_SECONDS = 365 * 24 * 3600; // 1 year @@ -52,47 +52,51 @@ const hashPassword = (password) => // ─── Schema ──────────────────────────────────────────────────────────────── -const ensureAuthSchema = async (db) => { - await run( - db, - `CREATE TABLE IF NOT EXISTS auth_users ( - id TEXT PRIMARY KEY, - email TEXT NOT NULL UNIQUE COLLATE NOCASE, - name TEXT NOT NULL DEFAULT '', - password_hash TEXT NOT NULL, - created_at TEXT NOT NULL DEFAULT (datetime('now')) - )`, - ); -}; +const ensureAuthSchema = async (db) => { + await run( + db, + `CREATE TABLE IF NOT EXISTS auth_users ( + id TEXT PRIMARY KEY, + email TEXT NOT NULL UNIQUE, + name TEXT NOT NULL DEFAULT '', + password_hash TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + )`, + ); +}; // ─── Operations ─────────────────────────────────────────────────────────── -const signUp = async (db, email, name, password) => { - const normalizedEmail = email.trim().toLowerCase(); - const existing = await get(db, 'SELECT id FROM auth_users WHERE email = ?', [normalizedEmail]); - if (existing) { - const err = new Error('Email already in use.'); - err.code = 'EMAIL_TAKEN'; - err.status = 409; - throw err; - } - const id = `usr_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`; - await run(db, 'INSERT INTO auth_users (id, email, name, password_hash) VALUES (?, ?, ?, ?)', [ - id, - normalizedEmail, - name.trim(), - hashPassword(password), - ]); +const signUp = async (db, email, name, password) => { + const normalizedEmail = email.trim().toLowerCase(); + const existing = await get(db, 'SELECT id FROM auth_users WHERE LOWER(email) = LOWER($1)', [normalizedEmail]); + if (existing) { + const err = new Error('Email already in use.'); + err.code = 'EMAIL_TAKEN'; + err.status = 409; + throw err; + } + const id = `usr_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`; + await run(db, 'INSERT INTO auth_users (id, email, name, password_hash) VALUES ($1, $2, $3, $4)', [ + id, + normalizedEmail, + name.trim(), + hashPassword(password), + ]); return { id, email: normalizedEmail, name: name.trim() }; }; -const login = async (db, email, password) => { - const normalizedEmail = email.trim().toLowerCase(); - const user = await get(db, 'SELECT id, email, name, password_hash FROM auth_users WHERE email = ?', [normalizedEmail]); - if (!user) { - const err = new Error('No account found for this email.'); - err.code = 'USER_NOT_FOUND'; - err.status = 401; +const login = async (db, email, password) => { + const normalizedEmail = email.trim().toLowerCase(); + const user = await get( + db, + 'SELECT id, email, name, password_hash FROM auth_users WHERE LOWER(email) = LOWER($1)', + [normalizedEmail], + ); + if (!user) { + const err = new Error('No account found for this email.'); + err.code = 'USER_NOT_FOUND'; + err.status = 401; throw err; } if (user.password_hash !== hashPassword(password)) { diff --git a/server/lib/billing.js b/server/lib/billing.js index 796462a..11012e4 100644 --- a/server/lib/billing.js +++ b/server/lib/billing.js @@ -1,7 +1,7 @@ -const { get, run } = require('./sqlite'); - -const FREE_MONTHLY_CREDITS = 15; -const PRO_MONTHLY_CREDITS = 250; +const { get, run } = require('./postgres'); + +const FREE_MONTHLY_CREDITS = 15; +const PRO_MONTHLY_CREDITS = 250; const TOPUP_DEFAULT_CREDITS = 60; const REVENUECAT_PRO_ENTITLEMENT_ID = (process.env.REVENUECAT_PRO_ENTITLEMENT_ID || 'pro').trim() || 'pro'; const SUPPORTED_SUBSCRIPTION_PRODUCTS = new Set(['monthly_pro', 'yearly_pro']); @@ -13,206 +13,211 @@ const TOPUP_CREDITS_BY_PRODUCT = { topup_medium: 120, topup_large: 300, }; - -const AVAILABLE_PRODUCTS = ['monthly_pro', 'yearly_pro', 'topup_small', 'topup_medium', 'topup_large']; - -const nowIso = () => new Date().toISOString(); - -const startOfUtcMonth = (date) => { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1, 0, 0, 0, 0)); -}; - -const addUtcMonths = (date, months) => { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + months, 1, 0, 0, 0, 0)); -}; - -const addDays = (date, days) => { - const result = new Date(date.getTime()); - result.setUTCDate(result.getUTCDate() + days); - return result; -}; - -const getCycleBounds = (now) => { - const cycleStartedAt = startOfUtcMonth(now); - const cycleEndsAt = addUtcMonths(cycleStartedAt, 1); - return { cycleStartedAt, cycleEndsAt }; -}; - -const getMonthlyAllowanceForPlan = (plan) => { - return plan === 'pro' ? PRO_MONTHLY_CREDITS : FREE_MONTHLY_CREDITS; -}; - -const createInsufficientCreditsError = (required, available) => { - const error = new Error(`Insufficient credits. Required ${required}, available ${available}.`); - error.code = 'INSUFFICIENT_CREDITS'; - error.status = 402; - error.metadata = { required, available }; - return error; -}; - -const runInTransaction = async (db, worker) => { - await run(db, 'BEGIN IMMEDIATE TRANSACTION'); - try { - const result = await worker(); - await run(db, 'COMMIT'); - return result; - } catch (error) { - try { - await run(db, 'ROLLBACK'); - } catch (rollbackError) { - console.error('Failed to rollback SQLite transaction.', rollbackError); - } - throw error; - } -}; - -const normalizeAccountRow = (row) => { - if (!row) return null; - return { - userId: String(row.userId), - plan: row.plan === 'pro' ? 'pro' : 'free', - provider: typeof row.provider === 'string' && row.provider ? row.provider : 'revenuecat', - cycleStartedAt: String(row.cycleStartedAt), - cycleEndsAt: String(row.cycleEndsAt), - monthlyAllowance: Number(row.monthlyAllowance) || FREE_MONTHLY_CREDITS, - usedThisCycle: Number(row.usedThisCycle) || 0, - topupBalance: Number(row.topupBalance) || 0, - renewsAt: row.renewsAt ? String(row.renewsAt) : null, - updatedAt: row.updatedAt ? String(row.updatedAt) : nowIso(), - }; -}; - -const buildDefaultAccount = (userId, now) => { - const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); - return { - userId, - plan: 'free', - provider: 'revenuecat', - cycleStartedAt: cycleStartedAt.toISOString(), - cycleEndsAt: cycleEndsAt.toISOString(), - monthlyAllowance: FREE_MONTHLY_CREDITS, - usedThisCycle: 0, - topupBalance: 0, - renewsAt: null, - updatedAt: nowIso(), - }; -}; - -const alignAccountToCurrentCycle = (account, now) => { - const next = { ...account }; - const expectedMonthlyAllowance = getMonthlyAllowanceForPlan(next.plan); - if (next.monthlyAllowance !== expectedMonthlyAllowance) { - next.monthlyAllowance = expectedMonthlyAllowance; - } - - if (!next.renewsAt && next.plan === 'pro') { - next.renewsAt = addDays(now, 30).toISOString(); - } - - const cycleEndsAtMs = new Date(next.cycleEndsAt).getTime(); - if (Number.isNaN(cycleEndsAtMs) || now.getTime() >= cycleEndsAtMs) { - const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); - next.cycleStartedAt = cycleStartedAt.toISOString(); - next.cycleEndsAt = cycleEndsAt.toISOString(); - next.usedThisCycle = 0; - next.monthlyAllowance = expectedMonthlyAllowance; - } - - return next; -}; - -const accountChanged = (a, b) => { - return a.userId !== b.userId - || a.plan !== b.plan - || a.provider !== b.provider - || a.cycleStartedAt !== b.cycleStartedAt - || a.cycleEndsAt !== b.cycleEndsAt - || a.monthlyAllowance !== b.monthlyAllowance - || a.usedThisCycle !== b.usedThisCycle - || a.topupBalance !== b.topupBalance - || a.renewsAt !== b.renewsAt; -}; - -const upsertAccount = async (db, account) => { - await run( - db, - `INSERT INTO billing_accounts ( - userId, - plan, - provider, - cycleStartedAt, - cycleEndsAt, - monthlyAllowance, - usedThisCycle, - topupBalance, - renewsAt, - updatedAt - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - ON CONFLICT(userId) DO UPDATE SET - plan = excluded.plan, - provider = excluded.provider, - cycleStartedAt = excluded.cycleStartedAt, - cycleEndsAt = excluded.cycleEndsAt, - monthlyAllowance = excluded.monthlyAllowance, - usedThisCycle = excluded.usedThisCycle, - topupBalance = excluded.topupBalance, - renewsAt = excluded.renewsAt, - updatedAt = excluded.updatedAt`, - [ - account.userId, - account.plan, - account.provider, - account.cycleStartedAt, - account.cycleEndsAt, - account.monthlyAllowance, - account.usedThisCycle, - account.topupBalance, - account.renewsAt, - account.updatedAt, - ], - ); -}; - -const getOrCreateAccount = async (db, userId) => { - const row = await get( - db, - `SELECT - userId, - plan, - provider, - cycleStartedAt, - cycleEndsAt, - monthlyAllowance, - usedThisCycle, - topupBalance, - renewsAt, - updatedAt - FROM billing_accounts - WHERE userId = ?`, - [userId], - ); - - const now = new Date(); - if (!row) { - const created = buildDefaultAccount(userId, now); - await upsertAccount(db, created); - return created; - } - - const existing = normalizeAccountRow(row); - const aligned = alignAccountToCurrentCycle(existing, now); - if (accountChanged(existing, aligned)) { - aligned.updatedAt = nowIso(); - await upsertAccount(db, aligned); - } - return aligned; -}; - -const getAvailableCredits = (account) => { - const monthlyRemaining = Math.max(0, account.monthlyAllowance - account.usedThisCycle); - return monthlyRemaining + Math.max(0, account.topupBalance); -}; - + +const AVAILABLE_PRODUCTS = ['monthly_pro', 'yearly_pro', 'topup_small', 'topup_medium', 'topup_large']; + +const nowIso = () => new Date().toISOString(); + +const startOfUtcMonth = (date) => { + return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1, 0, 0, 0, 0)); +}; + +const addUtcMonths = (date, months) => { + return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + months, 1, 0, 0, 0, 0)); +}; + +const addDays = (date, days) => { + const result = new Date(date.getTime()); + result.setUTCDate(result.getUTCDate() + days); + return result; +}; + +const getCycleBounds = (now) => { + const cycleStartedAt = startOfUtcMonth(now); + const cycleEndsAt = addUtcMonths(cycleStartedAt, 1); + return { cycleStartedAt, cycleEndsAt }; +}; + +const getMonthlyAllowanceForPlan = (plan) => { + return plan === 'pro' ? PRO_MONTHLY_CREDITS : FREE_MONTHLY_CREDITS; +}; + +const createInsufficientCreditsError = (required, available) => { + const error = new Error(`Insufficient credits. Required ${required}, available ${available}.`); + error.code = 'INSUFFICIENT_CREDITS'; + error.status = 402; + error.metadata = { required, available }; + return error; +}; + +const runInTransaction = async (db, worker) => { + const client = typeof db.connect === 'function' ? await db.connect() : db; + const release = typeof client.release === 'function' ? () => client.release() : () => {}; + + await run(client, 'BEGIN'); + try { + const result = await worker(client); + await run(client, 'COMMIT'); + return result; + } catch (error) { + try { + await run(client, 'ROLLBACK'); + } catch (rollbackError) { + console.error('Failed to rollback billing transaction.', rollbackError); + } + throw error; + } finally { + release(); + } +}; + +const normalizeAccountRow = (row) => { + if (!row) return null; + return { + userId: String(row.userId), + plan: row.plan === 'pro' ? 'pro' : 'free', + provider: typeof row.provider === 'string' && row.provider ? row.provider : 'revenuecat', + cycleStartedAt: String(row.cycleStartedAt), + cycleEndsAt: String(row.cycleEndsAt), + monthlyAllowance: Number(row.monthlyAllowance) || FREE_MONTHLY_CREDITS, + usedThisCycle: Number(row.usedThisCycle) || 0, + topupBalance: Number(row.topupBalance) || 0, + renewsAt: row.renewsAt ? String(row.renewsAt) : null, + updatedAt: row.updatedAt ? String(row.updatedAt) : nowIso(), + }; +}; + +const buildDefaultAccount = (userId, now) => { + const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); + return { + userId, + plan: 'free', + provider: 'revenuecat', + cycleStartedAt: cycleStartedAt.toISOString(), + cycleEndsAt: cycleEndsAt.toISOString(), + monthlyAllowance: FREE_MONTHLY_CREDITS, + usedThisCycle: 0, + topupBalance: 0, + renewsAt: null, + updatedAt: nowIso(), + }; +}; + +const alignAccountToCurrentCycle = (account, now) => { + const next = { ...account }; + const expectedMonthlyAllowance = getMonthlyAllowanceForPlan(next.plan); + if (next.monthlyAllowance !== expectedMonthlyAllowance) { + next.monthlyAllowance = expectedMonthlyAllowance; + } + + if (!next.renewsAt && next.plan === 'pro') { + next.renewsAt = addDays(now, 30).toISOString(); + } + + const cycleEndsAtMs = new Date(next.cycleEndsAt).getTime(); + if (Number.isNaN(cycleEndsAtMs) || now.getTime() >= cycleEndsAtMs) { + const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); + next.cycleStartedAt = cycleStartedAt.toISOString(); + next.cycleEndsAt = cycleEndsAt.toISOString(); + next.usedThisCycle = 0; + next.monthlyAllowance = expectedMonthlyAllowance; + } + + return next; +}; + +const accountChanged = (a, b) => { + return a.userId !== b.userId + || a.plan !== b.plan + || a.provider !== b.provider + || a.cycleStartedAt !== b.cycleStartedAt + || a.cycleEndsAt !== b.cycleEndsAt + || a.monthlyAllowance !== b.monthlyAllowance + || a.usedThisCycle !== b.usedThisCycle + || a.topupBalance !== b.topupBalance + || a.renewsAt !== b.renewsAt; +}; + +const upsertAccount = async (db, account) => { + await run( + db, + `INSERT INTO billing_accounts ( + user_id, + plan, + provider, + cycle_started_at, + cycle_ends_at, + monthly_allowance, + used_this_cycle, + topup_balance, + renews_at, + updated_at + ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) + ON CONFLICT (user_id) DO UPDATE SET + plan = EXCLUDED.plan, + provider = EXCLUDED.provider, + cycle_started_at = EXCLUDED.cycle_started_at, + cycle_ends_at = EXCLUDED.cycle_ends_at, + monthly_allowance = EXCLUDED.monthly_allowance, + used_this_cycle = EXCLUDED.used_this_cycle, + topup_balance = EXCLUDED.topup_balance, + renews_at = EXCLUDED.renews_at, + updated_at = EXCLUDED.updated_at`, + [ + account.userId, + account.plan, + account.provider, + account.cycleStartedAt, + account.cycleEndsAt, + account.monthlyAllowance, + account.usedThisCycle, + account.topupBalance, + account.renewsAt, + account.updatedAt, + ], + ); +}; + +const getOrCreateAccount = async (db, userId) => { + const row = await get( + db, + `SELECT + user_id AS "userId", + plan, + provider, + cycle_started_at AS "cycleStartedAt", + cycle_ends_at AS "cycleEndsAt", + monthly_allowance AS "monthlyAllowance", + used_this_cycle AS "usedThisCycle", + topup_balance AS "topupBalance", + renews_at AS "renewsAt", + updated_at AS "updatedAt" + FROM billing_accounts + WHERE user_id = $1`, + [userId], + ); + + const now = new Date(); + if (!row) { + const created = buildDefaultAccount(userId, now); + await upsertAccount(db, created); + return created; + } + + const existing = normalizeAccountRow(row); + const aligned = alignAccountToCurrentCycle(existing, now); + if (accountChanged(existing, aligned)) { + aligned.updatedAt = nowIso(); + await upsertAccount(db, aligned); + } + return aligned; +}; + +const getAvailableCredits = (account) => { + const monthlyRemaining = Math.max(0, account.monthlyAllowance - account.usedThisCycle); + return monthlyRemaining + Math.max(0, account.topupBalance); +}; + const buildBillingSummary = (account) => { return { entitlement: { @@ -221,15 +226,15 @@ const buildBillingSummary = (account) => { status: account.plan === 'pro' ? 'active' : 'inactive', renewsAt: account.renewsAt, }, - credits: { - monthlyAllowance: account.monthlyAllowance, - usedThisCycle: account.usedThisCycle, - topupBalance: account.topupBalance, - available: getAvailableCredits(account), - cycleStartedAt: account.cycleStartedAt, - cycleEndsAt: account.cycleEndsAt, - }, - availableProducts: AVAILABLE_PRODUCTS, + credits: { + monthlyAllowance: account.monthlyAllowance, + usedThisCycle: account.usedThisCycle, + topupBalance: account.topupBalance, + available: getAvailableCredits(account), + cycleStartedAt: account.cycleStartedAt, + cycleEndsAt: account.cycleEndsAt, + }, + availableProducts: AVAILABLE_PRODUCTS, }; }; @@ -253,13 +258,53 @@ const asIsoDate = (value) => { }; const isSupportedTopupProduct = (productId) => { - return typeof productId === 'string' && productId.startsWith('topup_') && typeof TOPUP_CREDITS_BY_PRODUCT[productId] === 'number'; + return typeof productId === 'string' + && productId.startsWith('topup_') + && typeof TOPUP_CREDITS_BY_PRODUCT[productId] === 'number'; }; const normalizeRevenueCatTransactions = (customerInfo) => { const nonSubscriptions = customerInfo?.nonSubscriptions; if (!nonSubscriptions || typeof nonSubscriptions !== 'object') return []; - return Object.values(nonSubscriptions).flatMap((entries) => Array.isArray(entries) ? entries : []); + return Object.values(nonSubscriptions).flatMap((entries) => (Array.isArray(entries) ? entries : [])); +}; + +const summarizeRevenueCatCustomerInfo = (customerInfo) => { + const activeEntitlements = customerInfo?.entitlements?.active || {}; + return { + appUserId: customerInfo?.appUserId || customerInfo?.app_user_id || null, + originalAppUserId: customerInfo?.originalAppUserId || customerInfo?.original_app_user_id || null, + activeEntitlements: Object.entries(activeEntitlements).map(([id, entitlement]) => ({ + id, + productIdentifier: entitlement?.productIdentifier || null, + expirationDate: entitlement?.expirationDate || entitlement?.expiresDate || null, + })), + allPurchasedProductIdentifiers: Array.isArray(customerInfo?.allPurchasedProductIdentifiers) + ? customerInfo.allPurchasedProductIdentifiers + : [], + nonSubscriptionTransactions: normalizeRevenueCatTransactions(customerInfo).map((transaction) => ({ + productIdentifier: transaction?.productIdentifier || null, + transactionIdentifier: transaction?.transactionIdentifier || transaction?.transactionId || null, + })), + }; +}; + +const getValidProEntitlement = (customerInfo) => { + const activeEntitlements = customerInfo?.entitlements?.active || {}; + const proEntitlement = activeEntitlements[REVENUECAT_PRO_ENTITLEMENT_ID]; + if (!proEntitlement) { + return null; + } + + if ( + typeof proEntitlement?.productIdentifier === 'string' + && SUPPORTED_SUBSCRIPTION_PRODUCTS.has(proEntitlement.productIdentifier) + ) { + return proEntitlement; + } + + console.warn('[Billing] Ignoring unsupported RevenueCat pro entitlement', summarizeRevenueCatCustomerInfo(customerInfo)); + return null; }; const applyRevenueCatEntitlementState = (account, options) => { @@ -279,6 +324,39 @@ const applyRevenueCatEntitlementState = (account, options) => { } }; +const parseStoredJson = (raw) => { + if (raw == null) return null; + if (typeof raw === 'object') return raw; + if (typeof raw !== 'string') return null; + try { + return JSON.parse(raw); + } catch { + return null; + } +}; + +const readIdempotentValue = async (db, key) => { + const row = await get( + db, + 'SELECT response_json AS "responseJson" FROM billing_idempotency WHERE id = $1', + [key], + ); + if (!row) return null; + return parseStoredJson(row.responseJson); +}; + +const writeIdempotentValue = async (db, key, value) => { + await run( + db, + `INSERT INTO billing_idempotency (id, response_json, created_at) + VALUES ($1, CAST($2 AS jsonb), $3) + ON CONFLICT (id) DO UPDATE SET + response_json = EXCLUDED.response_json, + created_at = EXCLUDED.created_at`, + [key, JSON.stringify(value), nowIso()], + ); +}; + const grantRevenueCatTopupIfNeeded = async (db, account, transactionId, productId) => { if (!transactionId || !isSupportedTopupProduct(productId)) { return false; @@ -291,21 +369,29 @@ const grantRevenueCatTopupIfNeeded = async (db, account, transactionId, productI return true; }; -const syncRevenueCatCustomerInfo = async (db, userId, customerInfo) => { - return runInTransaction(db, async () => { - const account = await getOrCreateAccount(db, userId); - const activeEntitlements = customerInfo?.entitlements?.active || {}; - const proEntitlement = activeEntitlements[REVENUECAT_PRO_ENTITLEMENT_ID]; +const syncRevenueCatCustomerInfo = async (db, userId, customerInfo, options = {}) => { + return runInTransaction(db, async (tx) => { + const account = await getOrCreateAccount(tx, userId); + const proEntitlement = getValidProEntitlement(customerInfo); + const source = typeof options.source === 'string' ? options.source : 'app_init'; - applyRevenueCatEntitlementState(account, { - active: Boolean(proEntitlement), - renewsAt: asIsoDate(proEntitlement?.expirationDate || proEntitlement?.expiresDate), + console.log('[Billing] Syncing RevenueCat customer info', { + userId, + source, + customerInfo: summarizeRevenueCatCustomerInfo(customerInfo), }); + if (source !== 'topup_purchase') { + applyRevenueCatEntitlementState(account, { + active: Boolean(proEntitlement), + renewsAt: asIsoDate(proEntitlement?.expirationDate || proEntitlement?.expiresDate), + }); + } + const transactions = normalizeRevenueCatTransactions(customerInfo); for (const transaction of transactions) { await grantRevenueCatTopupIfNeeded( - db, + tx, account, transaction?.transactionIdentifier || transaction?.transactionId, transaction?.productIdentifier, @@ -313,7 +399,7 @@ const syncRevenueCatCustomerInfo = async (db, userId, customerInfo) => { } account.updatedAt = nowIso(); - await upsertAccount(db, account); + await upsertAccount(tx, account); return { billing: buildBillingSummary(account), syncedAt: nowIso(), @@ -340,10 +426,10 @@ const shouldRevokeRevenueCatSubscription = (eventType) => { const syncRevenueCatWebhookEvent = async (db, eventPayload) => { const appUserId = String( - eventPayload?.app_user_id || - eventPayload?.appUserId || - eventPayload?.original_app_user_id || - '', + eventPayload?.app_user_id + || eventPayload?.appUserId + || eventPayload?.original_app_user_id + || '', ).trim(); if (!appUserId) { const error = new Error('RevenueCat webhook is missing app_user_id.'); @@ -352,12 +438,24 @@ const syncRevenueCatWebhookEvent = async (db, eventPayload) => { throw error; } - return runInTransaction(db, async () => { - const account = await getOrCreateAccount(db, appUserId); + return runInTransaction(db, async (tx) => { + const account = await getOrCreateAccount(tx, appUserId); const eventType = String(eventPayload?.type || '').toUpperCase(); const productId = typeof eventPayload?.product_id === 'string' ? eventPayload.product_id : ''; const entitlementIds = Array.isArray(eventPayload?.entitlement_ids) ? eventPayload.entitlement_ids : []; - const affectsProEntitlement = entitlementIds.includes(REVENUECAT_PRO_ENTITLEMENT_ID) || SUPPORTED_SUBSCRIPTION_PRODUCTS.has(productId); + const hasSubscriptionProduct = SUPPORTED_SUBSCRIPTION_PRODUCTS.has(productId); + const hasTopupProduct = isSupportedTopupProduct(productId); + const affectsProEntitlement = hasSubscriptionProduct + || (entitlementIds.includes(REVENUECAT_PRO_ENTITLEMENT_ID) && !hasTopupProduct); + + if (entitlementIds.includes(REVENUECAT_PRO_ENTITLEMENT_ID) && hasTopupProduct) { + console.warn('[Billing] Ignoring RevenueCat webhook entitlement for top-up product', { + appUserId, + eventType, + productId, + entitlementIds, + }); + } if (affectsProEntitlement && shouldGrantRevenueCatSubscription(eventType)) { applyRevenueCatEntitlementState(account, { @@ -373,7 +471,7 @@ const syncRevenueCatWebhookEvent = async (db, eventPayload) => { if (isSupportedTopupProduct(productId)) { await grantRevenueCatTopupIfNeeded( - db, + tx, account, eventPayload?.transaction_id || eventPayload?.store_transaction_id || eventPayload?.id, productId, @@ -381,295 +479,264 @@ const syncRevenueCatWebhookEvent = async (db, eventPayload) => { } account.updatedAt = nowIso(); - await upsertAccount(db, account); + await upsertAccount(tx, account); return { billing: buildBillingSummary(account), syncedAt: nowIso(), }; }); }; - -const consumeCredits = (account, cost) => { - if (cost <= 0) return 0; - - const available = getAvailableCredits(account); - if (available < cost) { - throw createInsufficientCreditsError(cost, available); - } - - let remaining = cost; - const monthlyRemaining = Math.max(0, account.monthlyAllowance - account.usedThisCycle); - if (monthlyRemaining > 0) { - const monthlyUsage = Math.min(monthlyRemaining, remaining); - account.usedThisCycle += monthlyUsage; - remaining -= monthlyUsage; - } - - if (remaining > 0 && account.topupBalance > 0) { - const topupUsage = Math.min(account.topupBalance, remaining); - account.topupBalance -= topupUsage; - remaining -= topupUsage; - } - - return cost; -}; - -const parseStoredJson = (raw) => { - if (!raw || typeof raw !== 'string') return null; - try { - return JSON.parse(raw); - } catch { - return null; - } -}; - -const readIdempotentValue = async (db, key) => { - const row = await get(db, 'SELECT responseJson FROM billing_idempotency WHERE id = ?', [key]); - if (!row || typeof row.responseJson !== 'string') return null; - return parseStoredJson(row.responseJson); -}; - -const writeIdempotentValue = async (db, key, value) => { - await run( - db, - `INSERT INTO billing_idempotency (id, responseJson, createdAt) - VALUES (?, ?, ?) - ON CONFLICT(id) DO UPDATE SET - responseJson = excluded.responseJson, - createdAt = excluded.createdAt`, - [key, JSON.stringify(value), nowIso()], - ); -}; - -const endpointKey = (scope, userId, idempotencyKey) => { - return `endpoint:${scope}:${userId}:${idempotencyKey}`; -}; - -const chargeKey = (scope, userId, idempotencyKey) => { - return `charge:${scope}:${userId}:${idempotencyKey}`; -}; - -const consumeCreditsWithIdempotency = async (db, userId, key, cost) => { - return runInTransaction(db, async () => { - const existing = await readIdempotentValue(db, key); - if (existing && typeof existing.charged === 'number') return existing.charged; - - const account = await getOrCreateAccount(db, userId); - const charged = consumeCredits(account, cost); - account.updatedAt = nowIso(); - await upsertAccount(db, account); - await writeIdempotentValue(db, key, { charged }); - return charged; - }); -}; - -const getBillingSummary = async (db, userId) => { - if (userId === 'guest') { - return { - entitlement: { plan: 'free', provider: 'mock', status: 'active', renewsAt: null }, - credits: { - monthlyAllowance: 5, - usedThisCycle: 0, - topupBalance: 0, - available: 5, - cycleStartedAt: nowIso(), - cycleEndsAt: nowIso() - }, - availableProducts: AVAILABLE_PRODUCTS, - }; - } - return runInTransaction(db, async () => { - const account = await getOrCreateAccount(db, userId); - account.updatedAt = nowIso(); - await upsertAccount(db, account); - return buildBillingSummary(account); - }); -}; - -const getAccountSnapshot = async (db, userId) => { - if (userId === 'guest') { - return { - userId: 'guest', - plan: 'free', - provider: 'mock', - cycleStartedAt: nowIso(), - cycleEndsAt: nowIso(), - monthlyAllowance: 5, - usedThisCycle: 0, - topupBalance: 0, - renewsAt: null, - updatedAt: nowIso(), - }; - } - return runInTransaction(db, async () => { - const account = await getOrCreateAccount(db, userId); - account.updatedAt = nowIso(); - await upsertAccount(db, account); - return account; - }); -}; - -const getEndpointResponse = async (db, key) => { - const cached = await readIdempotentValue(db, key); - return cached || null; -}; - -const storeEndpointResponse = async (db, key, response) => { - await writeIdempotentValue(db, key, response); -}; - -const simulatePurchase = async (db, userId, idempotencyKey, productId) => { - const endpointId = endpointKey('simulate-purchase', userId, idempotencyKey); - const cached = await getEndpointResponse(db, endpointId); - if (cached) return cached; - - const response = await runInTransaction(db, async () => { - const existingInsideTx = await readIdempotentValue(db, endpointId); - if (existingInsideTx) return existingInsideTx; - - const account = await getOrCreateAccount(db, userId); - - if (productId === 'monthly_pro' || productId === 'yearly_pro') { - const now = new Date(); - const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); - account.plan = 'pro'; - account.provider = 'revenuecat'; - account.monthlyAllowance = PRO_MONTHLY_CREDITS; - account.usedThisCycle = 0; - account.cycleStartedAt = cycleStartedAt.toISOString(); - account.cycleEndsAt = cycleEndsAt.toISOString(); - account.renewsAt = addDays(now, 30).toISOString(); - } else { - const credits = TOPUP_CREDITS_BY_PRODUCT[productId]; - if (typeof credits !== 'number') { - const error = new Error(`Unsupported product: ${productId}`); - error.code = 'BAD_REQUEST'; - error.status = 400; - throw error; - } - account.topupBalance += credits; - } - - account.updatedAt = nowIso(); - await upsertAccount(db, account); - - const payload = { - appliedProduct: productId, - billing: buildBillingSummary(account), - }; - await storeEndpointResponse(db, endpointId, payload); - return payload; - }); - - return response; -}; - -const simulateWebhook = async (db, userId, idempotencyKey, event, payload = {}) => { - const endpointId = endpointKey('simulate-webhook', userId, idempotencyKey); - const cached = await getEndpointResponse(db, endpointId); - if (cached) return cached; - - const response = await runInTransaction(db, async () => { - const existingInsideTx = await readIdempotentValue(db, endpointId); - if (existingInsideTx) return existingInsideTx; - - const account = await getOrCreateAccount(db, userId); - - if (event === 'entitlement_granted') { - const now = new Date(); - const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); - account.plan = 'pro'; - account.provider = 'revenuecat'; - account.monthlyAllowance = PRO_MONTHLY_CREDITS; - account.usedThisCycle = 0; - account.cycleStartedAt = cycleStartedAt.toISOString(); - account.cycleEndsAt = cycleEndsAt.toISOString(); - account.renewsAt = addDays(now, 30).toISOString(); - } else if (event === 'entitlement_revoked') { - const now = new Date(); - const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); - account.plan = 'free'; - account.provider = 'revenuecat'; - account.monthlyAllowance = FREE_MONTHLY_CREDITS; - account.usedThisCycle = 0; - account.cycleStartedAt = cycleStartedAt.toISOString(); - account.cycleEndsAt = cycleEndsAt.toISOString(); - account.renewsAt = null; - } else if (event === 'topup_granted') { - const credits = Math.max(1, Number(payload.credits) || TOPUP_DEFAULT_CREDITS); - account.topupBalance += credits; - } else if (event === 'credits_depleted') { - account.usedThisCycle = account.monthlyAllowance; - account.topupBalance = 0; - } else { - const error = new Error(`Unsupported webhook event: ${event}`); - error.code = 'BAD_REQUEST'; - error.status = 400; - throw error; - } - - account.updatedAt = nowIso(); - await upsertAccount(db, account); - - const payloadResponse = { - event, - billing: buildBillingSummary(account), - }; - await storeEndpointResponse(db, endpointId, payloadResponse); - return payloadResponse; - }); - - return response; -}; - -const ensureBillingSchema = async (db) => { - await run( - db, - `CREATE TABLE IF NOT EXISTS billing_accounts ( - userId TEXT PRIMARY KEY, - plan TEXT NOT NULL DEFAULT 'free', - provider TEXT NOT NULL DEFAULT 'revenuecat', - cycleStartedAt TEXT NOT NULL, - cycleEndsAt TEXT NOT NULL, - monthlyAllowance INTEGER NOT NULL DEFAULT 15, - usedThisCycle INTEGER NOT NULL DEFAULT 0, - topupBalance INTEGER NOT NULL DEFAULT 0, - renewsAt TEXT, - updatedAt TEXT NOT NULL - )`, - ); - - await run( - db, - `CREATE TABLE IF NOT EXISTS billing_idempotency ( - id TEXT PRIMARY KEY, - responseJson TEXT NOT NULL, - createdAt TEXT NOT NULL - )`, - ); - - await run( - db, - `CREATE INDEX IF NOT EXISTS idx_billing_idempotency_created_at - ON billing_idempotency(createdAt DESC)`, - ); -}; - -const isInsufficientCreditsError = (error) => { - return Boolean(error && typeof error === 'object' && error.code === 'INSUFFICIENT_CREDITS'); -}; - -module.exports = { - AVAILABLE_PRODUCTS, - chargeKey, - consumeCreditsWithIdempotency, - endpointKey, - ensureBillingSchema, - getAccountSnapshot, - getBillingSummary, - getEndpointResponse, - getMonthlyAllowanceForPlan, - isInsufficientCreditsError, + +const consumeCredits = (account, cost) => { + if (cost <= 0) return 0; + + const available = getAvailableCredits(account); + if (available < cost) { + throw createInsufficientCreditsError(cost, available); + } + + let remaining = cost; + const monthlyRemaining = Math.max(0, account.monthlyAllowance - account.usedThisCycle); + if (monthlyRemaining > 0) { + const monthlyUsage = Math.min(monthlyRemaining, remaining); + account.usedThisCycle += monthlyUsage; + remaining -= monthlyUsage; + } + + if (remaining > 0 && account.topupBalance > 0) { + const topupUsage = Math.min(account.topupBalance, remaining); + account.topupBalance -= topupUsage; + remaining -= topupUsage; + } + + return cost; +}; + +const endpointKey = (scope, userId, idempotencyKey) => { + return `endpoint:${scope}:${userId}:${idempotencyKey}`; +}; + +const chargeKey = (scope, userId, idempotencyKey) => { + return `charge:${scope}:${userId}:${idempotencyKey}`; +}; + +const consumeCreditsWithIdempotency = async (db, userId, key, cost) => { + return runInTransaction(db, async (tx) => { + const existing = await readIdempotentValue(tx, key); + if (existing && typeof existing.charged === 'number') return existing.charged; + + const account = await getOrCreateAccount(tx, userId); + const charged = consumeCredits(account, cost); + account.updatedAt = nowIso(); + await upsertAccount(tx, account); + await writeIdempotentValue(tx, key, { charged }); + return charged; + }); +}; + +const getBillingSummary = async (db, userId) => { + if (userId === 'guest') { + return { + entitlement: { plan: 'free', provider: 'mock', status: 'active', renewsAt: null }, + credits: { + monthlyAllowance: 5, + usedThisCycle: 0, + topupBalance: 0, + available: 5, + cycleStartedAt: nowIso(), + cycleEndsAt: nowIso(), + }, + availableProducts: AVAILABLE_PRODUCTS, + }; + } + return runInTransaction(db, async (tx) => { + const account = await getOrCreateAccount(tx, userId); + account.updatedAt = nowIso(); + await upsertAccount(tx, account); + return buildBillingSummary(account); + }); +}; + +const getAccountSnapshot = async (db, userId) => { + if (userId === 'guest') { + return { + userId: 'guest', + plan: 'free', + provider: 'mock', + cycleStartedAt: nowIso(), + cycleEndsAt: nowIso(), + monthlyAllowance: 5, + usedThisCycle: 0, + topupBalance: 0, + renewsAt: null, + updatedAt: nowIso(), + }; + } + return runInTransaction(db, async (tx) => { + const account = await getOrCreateAccount(tx, userId); + account.updatedAt = nowIso(); + await upsertAccount(tx, account); + return account; + }); +}; + +const getEndpointResponse = async (db, key) => { + const cached = await readIdempotentValue(db, key); + return cached || null; +}; + +const storeEndpointResponse = async (db, key, response) => { + await writeIdempotentValue(db, key, response); +}; + +const simulatePurchase = async (db, userId, idempotencyKey, productId) => { + const endpointId = endpointKey('simulate-purchase', userId, idempotencyKey); + const cached = await getEndpointResponse(db, endpointId); + if (cached) return cached; + + return runInTransaction(db, async (tx) => { + const existingInsideTx = await readIdempotentValue(tx, endpointId); + if (existingInsideTx) return existingInsideTx; + + const account = await getOrCreateAccount(tx, userId); + + if (productId === 'monthly_pro' || productId === 'yearly_pro') { + const now = new Date(); + const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); + account.plan = 'pro'; + account.provider = 'revenuecat'; + account.monthlyAllowance = PRO_MONTHLY_CREDITS; + account.usedThisCycle = 0; + account.cycleStartedAt = cycleStartedAt.toISOString(); + account.cycleEndsAt = cycleEndsAt.toISOString(); + account.renewsAt = addDays(now, 30).toISOString(); + } else { + const credits = TOPUP_CREDITS_BY_PRODUCT[productId]; + if (typeof credits !== 'number') { + const error = new Error(`Unsupported product: ${productId}`); + error.code = 'BAD_REQUEST'; + error.status = 400; + throw error; + } + account.topupBalance += credits; + } + + account.updatedAt = nowIso(); + await upsertAccount(tx, account); + + const payload = { + appliedProduct: productId, + billing: buildBillingSummary(account), + }; + await storeEndpointResponse(tx, endpointId, payload); + return payload; + }); +}; + +const simulateWebhook = async (db, userId, idempotencyKey, event, payload = {}) => { + const endpointId = endpointKey('simulate-webhook', userId, idempotencyKey); + const cached = await getEndpointResponse(db, endpointId); + if (cached) return cached; + + return runInTransaction(db, async (tx) => { + const existingInsideTx = await readIdempotentValue(tx, endpointId); + if (existingInsideTx) return existingInsideTx; + + const account = await getOrCreateAccount(tx, userId); + + if (event === 'entitlement_granted') { + const now = new Date(); + const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); + account.plan = 'pro'; + account.provider = 'revenuecat'; + account.monthlyAllowance = PRO_MONTHLY_CREDITS; + account.usedThisCycle = 0; + account.cycleStartedAt = cycleStartedAt.toISOString(); + account.cycleEndsAt = cycleEndsAt.toISOString(); + account.renewsAt = addDays(now, 30).toISOString(); + } else if (event === 'entitlement_revoked') { + const now = new Date(); + const { cycleStartedAt, cycleEndsAt } = getCycleBounds(now); + account.plan = 'free'; + account.provider = 'revenuecat'; + account.monthlyAllowance = FREE_MONTHLY_CREDITS; + account.usedThisCycle = 0; + account.cycleStartedAt = cycleStartedAt.toISOString(); + account.cycleEndsAt = cycleEndsAt.toISOString(); + account.renewsAt = null; + } else if (event === 'topup_granted') { + const credits = Math.max(1, Number(payload.credits) || TOPUP_DEFAULT_CREDITS); + account.topupBalance += credits; + } else if (event === 'credits_depleted') { + account.usedThisCycle = account.monthlyAllowance; + account.topupBalance = 0; + } else { + const error = new Error(`Unsupported webhook event: ${event}`); + error.code = 'BAD_REQUEST'; + error.status = 400; + throw error; + } + + account.updatedAt = nowIso(); + await upsertAccount(tx, account); + + const payloadResponse = { + event, + billing: buildBillingSummary(account), + }; + await storeEndpointResponse(tx, endpointId, payloadResponse); + return payloadResponse; + }); +}; + +const ensureBillingSchema = async (db) => { + await run( + db, + `CREATE TABLE IF NOT EXISTS billing_accounts ( + user_id TEXT PRIMARY KEY, + plan TEXT NOT NULL DEFAULT 'free', + provider TEXT NOT NULL DEFAULT 'revenuecat', + cycle_started_at TIMESTAMPTZ NOT NULL, + cycle_ends_at TIMESTAMPTZ NOT NULL, + monthly_allowance INTEGER NOT NULL DEFAULT 15, + used_this_cycle INTEGER NOT NULL DEFAULT 0, + topup_balance INTEGER NOT NULL DEFAULT 0, + renews_at TIMESTAMPTZ, + updated_at TIMESTAMPTZ NOT NULL + )`, + ); + + await run( + db, + `CREATE TABLE IF NOT EXISTS billing_idempotency ( + id TEXT PRIMARY KEY, + response_json JSONB NOT NULL, + created_at TIMESTAMPTZ NOT NULL + )`, + ); + + await run( + db, + `CREATE INDEX IF NOT EXISTS idx_billing_idempotency_created_at + ON billing_idempotency (created_at DESC)`, + ); +}; + +const isInsufficientCreditsError = (error) => { + return Boolean(error && typeof error === 'object' && error.code === 'INSUFFICIENT_CREDITS'); +}; + +module.exports = { + AVAILABLE_PRODUCTS, + chargeKey, + consumeCreditsWithIdempotency, + endpointKey, + ensureBillingSchema, + getAccountSnapshot, + getBillingSummary, + getEndpointResponse, + getMonthlyAllowanceForPlan, + isInsufficientCreditsError, runInTransaction, simulatePurchase, simulateWebhook, diff --git a/server/lib/plants.js b/server/lib/plants.js index 1d42385..010284a 100644 --- a/server/lib/plants.js +++ b/server/lib/plants.js @@ -1,724 +1,738 @@ -const crypto = require('crypto'); -const { all, get, run } = require('./sqlite'); -const { normalizeSearchText, rankHybridEntries } = require('./hybridSearch'); - -const DEFAULT_LIMIT = 60; -const MAX_LIMIT = 500; -const MAX_AUDIT_DETAILS = 80; -const WIKIMEDIA_FILEPATH_SEGMENT = 'Special:FilePath/'; -const WIKIMEDIA_REDIRECT_BASE = 'https://commons.wikimedia.org/wiki/Special:FilePath/'; -const WIKIMEDIA_SEARCH_PREFIX = 'wikimedia-search:'; -const LOCAL_PLANT_IMAGE_PREFIX = '/plants/'; -const LOCAL_PLANT_IMAGE_PATH_PATTERN = /^\/plants\/[A-Za-z0-9/_-]+\.[A-Za-z0-9]+$/; - -class PlantImportValidationError extends Error { - constructor(message, details) { - super(message); - this.name = 'PlantImportValidationError'; - this.details = details; - } -} - -const normalizeWhitespace = (value) => { - return value.trim().replace(/\s+/g, ' '); -}; - -const normalizeKey = (value) => normalizeSearchText(normalizeWhitespace(value)); - -const unwrapMarkdownLink = (value) => { - const markdownMatch = value.match(/^\[[^\]]+]\((https?:\/\/[^)]+)\)(.*)$/i); - if (!markdownMatch) return value; - const [, url, suffix] = markdownMatch; - return `${url}${suffix || ''}`; -}; - -const tryDecode = (value) => { - try { - return decodeURIComponent(value); - } catch { - return value; - } -}; - -const decodeRepeatedly = (value, rounds = 3) => { - let current = value; - for (let index = 0; index < rounds; index += 1) { - const decoded = tryDecode(current); - if (decoded === current) break; - current = decoded; - } - return current; -}; - -const convertWikimediaFilePathUrl = (value) => { - const segmentIndex = value.indexOf(WIKIMEDIA_FILEPATH_SEGMENT); - if (segmentIndex < 0) return null; - - const fileNameStart = segmentIndex + WIKIMEDIA_FILEPATH_SEGMENT.length; - const rawFileName = value.slice(fileNameStart).split(/[?#]/)[0].trim(); - if (!rawFileName) return null; - - const decodedFileName = tryDecode(rawFileName).replace(/\s+/g, ' ').trim(); - if (!decodedFileName) return null; - const encodedFileName = encodeURIComponent(decodedFileName).replace(/%2F/g, '/'); - return `${WIKIMEDIA_REDIRECT_BASE}${encodedFileName}`; -}; - -const toWikimediaFilePathUrl = (value) => { - if (typeof value !== 'string' || !value.includes('upload.wikimedia.org/wikipedia/commons/')) { - return null; - } - - const cleanUrl = value.split(/[?#]/)[0]; - const parts = cleanUrl.split('/').filter(Boolean); - if (parts.length < 2) return null; - - let fileName = null; - const thumbIndex = parts.indexOf('thumb'); - - if (thumbIndex >= 0 && parts.length >= thumbIndex + 5) { - fileName = parts[parts.length - 2]; - } else { - fileName = parts[parts.length - 1]; - } - - if (!fileName) return null; - - const decoded = tryDecode(fileName).trim(); - if (!decoded) return null; - - return `${WIKIMEDIA_REDIRECT_BASE}${encodeURIComponent(decoded)}`; -}; - -const normalizeLocalImagePath = (value) => { - if (typeof value !== 'string') return null; - - const trimmed = value.trim(); - if (!trimmed) return null; - - const withoutQuery = trimmed.split(/[?#]/)[0].replace(/\\/g, '/'); - const withLeadingSlash = withoutQuery.startsWith('/') ? withoutQuery : `/${withoutQuery}`; - - if (!withLeadingSlash.startsWith(LOCAL_PLANT_IMAGE_PREFIX)) return null; - if (withLeadingSlash.includes('..')) return null; - if (!LOCAL_PLANT_IMAGE_PATH_PATTERN.test(withLeadingSlash)) return null; - - return withLeadingSlash; -}; - -const normalizeWikimediaSearchUri = (value) => { - if (typeof value !== 'string') return null; - - const trimmed = value.trim(); - if (!trimmed.toLowerCase().startsWith(WIKIMEDIA_SEARCH_PREFIX)) return null; - - const rawQuery = trimmed.slice(WIKIMEDIA_SEARCH_PREFIX.length).trim(); - if (!rawQuery) return null; - - const normalizedQuery = normalizeWhitespace(decodeRepeatedly(rawQuery)); - if (!normalizedQuery) return null; - - return `${WIKIMEDIA_SEARCH_PREFIX}${encodeURIComponent(normalizedQuery)}`; -}; - -const normalizeImageUri = (rawUri) => { - if (typeof rawUri !== 'string') return null; - - const trimmed = rawUri.trim(); - if (!trimmed) return null; - - const localPath = normalizeLocalImagePath(trimmed); - if (localPath) return localPath; - - const wikimediaSearchUri = normalizeWikimediaSearchUri(trimmed); - if (wikimediaSearchUri) return wikimediaSearchUri; - - const normalized = unwrapMarkdownLink(trimmed); - const converted = convertWikimediaFilePathUrl(normalized); - const candidate = (converted || normalized).replace(/^http:\/\//i, 'https://'); - - let parsedUrl; - try { - parsedUrl = new URL(candidate); - } catch { - return null; - } - - const protocol = parsedUrl.protocol.toLowerCase(); - if (protocol !== 'https:' && protocol !== 'http:') return null; - if (!parsedUrl.hostname) return null; - - parsedUrl.protocol = 'https:'; - return parsedUrl.toString(); -}; - -const toArrayOfStrings = (value) => { - if (!Array.isArray(value)) return []; - const normalized = value - .map((item) => (typeof item === 'string' ? normalizeWhitespace(item) : '')) - .filter(Boolean); - return [...new Set(normalized)]; -}; - -const parseNumber = (value, fallback) => { - const parsed = Number(value); - if (!Number.isFinite(parsed)) return fallback; - return parsed; -}; - -const buildStablePlantId = (botanicalName) => { - const hash = crypto - .createHash('sha1') - .update(normalizeKey(botanicalName)) - .digest('hex') - .slice(0, 16); - return `plant_${hash}`; -}; - -const parseExistingIdMap = (rows) => { - const botanicalToId = new Map(); - rows.forEach((row) => { - if (!row || typeof row.botanicalName !== 'string' || typeof row.id !== 'string') return; - botanicalToId.set(normalizeKey(row.botanicalName), row.id); - }); - return botanicalToId; -}; - -const prepareEntry = (rawEntry, index, existingIdMap, preserveExistingIds) => { - const errors = []; - - const name = typeof rawEntry?.name === 'string' ? normalizeWhitespace(rawEntry.name) : ''; - const botanicalName = typeof rawEntry?.botanicalName === 'string' - ? normalizeWhitespace(rawEntry.botanicalName) - : ''; - - if (!name) { - errors.push({ index, field: 'name', message: 'name is required.' }); - } - if (!botanicalName) { - errors.push({ index, field: 'botanicalName', message: 'botanicalName is required.' }); - } - - const normalizedBotanicalKey = botanicalName ? normalizeKey(botanicalName) : ''; - const existingId = preserveExistingIds ? existingIdMap.get(normalizedBotanicalKey) : null; - - const incomingId = typeof rawEntry?.id === 'string' ? normalizeWhitespace(rawEntry.id) : ''; - const id = incomingId || existingId || (botanicalName ? buildStablePlantId(botanicalName) : ''); - - if (!id) { - errors.push({ index, field: 'id', message: 'Could not derive stable plant id.' }); - } - - const imageUri = normalizeImageUri(rawEntry?.imageUri); - if (!imageUri) { - errors.push({ - index, - field: 'imageUri', - message: 'imageUri is missing or invalid. Use a valid http(s) URL, a local /plants/... path, or wikimedia-search:.', - value: rawEntry?.imageUri ?? null, - }); - } - const imageStatus = imageUri && imageUri.startsWith(WIKIMEDIA_SEARCH_PREFIX) ? 'pending' : 'ok'; - - const categories = toArrayOfStrings(rawEntry?.categories); - const confidence = parseNumber(rawEntry?.confidence, 1); - const clampedConfidence = Math.max(0, Math.min(1, Number(confidence.toFixed(4)))); - const description = typeof rawEntry?.description === 'string' ? rawEntry.description.trim() : ''; - const careInfoRaw = rawEntry?.careInfo || {}; - const careInfo = { - waterIntervalDays: Math.max(1, Math.round(parseNumber(careInfoRaw.waterIntervalDays, 7))), - light: typeof careInfoRaw.light === 'string' && careInfoRaw.light.trim() - ? normalizeWhitespace(careInfoRaw.light) - : 'Unknown', - temp: typeof careInfoRaw.temp === 'string' && careInfoRaw.temp.trim() - ? normalizeWhitespace(careInfoRaw.temp) - : 'Unknown', - }; - - return { - entry: { - id, - name, - botanicalName, - imageUri, - imageStatus, - description, - categories, - careInfo, - confidence: clampedConfidence, - }, - errors, - }; -}; - -const collectDuplicateErrors = (entries, getKey, fieldName, message) => { - const counts = new Map(); - entries.forEach((entry, index) => { - const key = getKey(entry); - if (!key) return; - const existing = counts.get(key) || []; - existing.push(index); - counts.set(key, existing); - }); - - const duplicateErrors = []; - counts.forEach((indices, key) => { - if (indices.length <= 1) return; - indices.forEach((index) => { - duplicateErrors.push({ - index, - field: fieldName, - message, - value: key, - }); - }); - }); - return duplicateErrors; -}; - -const assertValidPreparedEntries = (entries, enforceUniqueImages) => { - const duplicateErrors = []; - duplicateErrors.push( - ...collectDuplicateErrors( - entries, - (entry) => entry.id, - 'id', - 'Duplicate plant id detected in import payload.', - ), - ); - duplicateErrors.push( - ...collectDuplicateErrors( - entries, - (entry) => normalizeKey(entry.botanicalName), - 'botanicalName', - 'Duplicate botanicalName detected in import payload.', - ), - ); - - if (enforceUniqueImages) { - duplicateErrors.push( - ...collectDuplicateErrors( - entries, - (entry) => entry.imageUri, - 'imageUri', - 'Duplicate imageUri detected across multiple plants.', - ), - ); - } - - if (duplicateErrors.length > 0) { - throw new PlantImportValidationError( - 'Import payload contains duplicate keys.', - duplicateErrors.slice(0, MAX_AUDIT_DETAILS), - ); - } -}; - -const ensureColumn = async (db, tableName, columnName, definitionSql) => { - const columns = await all(db, `PRAGMA table_info(${tableName})`); - const hasColumn = columns.some((column) => column.name === columnName); - if (hasColumn) return; - await run(db, `ALTER TABLE ${tableName} ADD COLUMN ${columnName} ${definitionSql}`); -}; - -const ensurePlantSchema = async (db) => { - await run( - db, - `CREATE TABLE IF NOT EXISTS plants ( - id TEXT PRIMARY KEY, - name TEXT NOT NULL, - botanicalName TEXT NOT NULL, - imageUri TEXT NOT NULL, - description TEXT, - categories TEXT NOT NULL, - careInfo TEXT NOT NULL, - confidence REAL NOT NULL - )`, - ); - - await ensureColumn(db, 'plants', 'imageStatus', `TEXT NOT NULL DEFAULT 'ok'`); - await ensureColumn(db, 'plants', 'createdAt', `TEXT`); - await ensureColumn(db, 'plants', 'updatedAt', `TEXT`); - - await run( - db, - `CREATE TABLE IF NOT EXISTS plant_import_audit ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - source TEXT NOT NULL, - importedCount INTEGER NOT NULL DEFAULT 0, - preservedIds INTEGER NOT NULL DEFAULT 0, - duplicateImageCount INTEGER NOT NULL DEFAULT 0, - status TEXT NOT NULL, - details TEXT, - backupTable TEXT, - startedAt TEXT NOT NULL, - completedAt TEXT NOT NULL - )`, - ); - - await run( - db, - `CREATE INDEX IF NOT EXISTS idx_plants_name ON plants(name COLLATE NOCASE)`, - ); - await run( - db, - `CREATE INDEX IF NOT EXISTS idx_plants_botanical_name ON plants(botanicalName COLLATE NOCASE)`, - ); - await run( - db, - `CREATE INDEX IF NOT EXISTS idx_plant_import_audit_started_at ON plant_import_audit(startedAt DESC)`, - ); - - await run( - db, - `UPDATE plants SET imageStatus = COALESCE(NULLIF(imageStatus, ''), 'ok')`, - ); - await run( - db, - `UPDATE plants SET createdAt = COALESCE(createdAt, datetime('now'))`, - ); - await run( - db, - `UPDATE plants SET updatedAt = COALESCE(updatedAt, datetime('now'))`, - ); -}; - -const parseJsonArray = (value) => { - if (!value) return []; - if (Array.isArray(value)) return value; - try { - const parsed = JSON.parse(value); - return Array.isArray(parsed) ? parsed : []; - } catch { - return []; - } -}; - -const parseJsonObject = (value) => { - if (!value) return {}; - if (typeof value === 'object') return value; - try { - const parsed = JSON.parse(value); - return parsed && typeof parsed === 'object' ? parsed : {}; - } catch { - return {}; - } -}; - -const toApiPlant = (row) => { - const categories = parseJsonArray(row.categories); - const careInfo = parseJsonObject(row.careInfo); - const imageUri = toWikimediaFilePathUrl(row.imageUri) || row.imageUri; - return { - id: row.id, - name: row.name, - botanicalName: row.botanicalName, - imageUri, - imageStatus: row.imageStatus || 'ok', - description: row.description || '', - categories, - careInfo, - confidence: Number(row.confidence) || 0, - }; -}; - -const getPlants = async (db, options = {}) => { - const query = typeof options.query === 'string' ? options.query.trim() : ''; - const category = typeof options.category === 'string' ? options.category.trim() : ''; - const limitRaw = Number(options.limit); - const limit = Number.isFinite(limitRaw) - ? Math.max(1, Math.min(MAX_LIMIT, Math.round(limitRaw))) - : DEFAULT_LIMIT; - - let sql = `SELECT - id, - name, - botanicalName, - imageUri, - imageStatus, - description, - categories, - careInfo, - confidence - FROM plants`; - const params = []; - sql += ' ORDER BY name COLLATE NOCASE ASC'; - - const rows = await all(db, sql, params); - let results = rows.map(toApiPlant); - - if (category) { - results = results.filter((plant) => plant.categories.includes(category)); - } - - if (!query) { - return results.slice(0, limit); - } - - return rankHybridEntries(results, query, limit) - .map((candidate) => candidate.entry); -}; - -const getPlantDiagnostics = async (db) => { - const totals = await get( - db, - `SELECT - COUNT(*) AS totalCount, - SUM(CASE WHEN imageUri IS NULL OR TRIM(imageUri) = '' THEN 1 ELSE 0 END) AS missingImageCount, - SUM(CASE WHEN COALESCE(imageStatus, 'ok') <> 'ok' THEN 1 ELSE 0 END) AS nonOkImageStatusCount - FROM plants`, - ); - - const duplicateImages = await all( - db, - `SELECT imageUri, COUNT(*) AS count - FROM plants - WHERE imageUri IS NOT NULL AND TRIM(imageUri) <> '' - GROUP BY imageUri - HAVING COUNT(*) > 1 - ORDER BY count DESC, imageUri ASC - LIMIT 200`, - ); - - const duplicateBotanicalNames = await all( - db, - `SELECT botanicalName, COUNT(*) AS count - FROM plants - WHERE botanicalName IS NOT NULL AND TRIM(botanicalName) <> '' - GROUP BY LOWER(botanicalName) - HAVING COUNT(*) > 1 - ORDER BY count DESC, botanicalName ASC - LIMIT 200`, - ); - - const recentAudits = await all( - db, - `SELECT - id, - source, - importedCount, - preservedIds, - duplicateImageCount, - status, - details, - backupTable, - startedAt, - completedAt - FROM plant_import_audit - ORDER BY startedAt DESC - LIMIT 20`, - ); - - return { - totalCount: Number(totals?.totalCount || 0), - missingImageCount: Number(totals?.missingImageCount || 0), - nonOkImageStatusCount: Number(totals?.nonOkImageStatusCount || 0), - duplicateImageCount: duplicateImages.length, - duplicateImages, - duplicateBotanicalNameCount: duplicateBotanicalNames.length, - duplicateBotanicalNames, - recentAudits: recentAudits.map((audit) => ({ - ...audit, - details: audit.details ? parseJsonObject(audit.details) : null, - })), - }; -}; - -const writeAuditRow = async (db, audit) => { - await run( - db, - `INSERT INTO plant_import_audit ( - source, - importedCount, - preservedIds, - duplicateImageCount, - status, - details, - backupTable, - startedAt, - completedAt - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [ - audit.source, - audit.importedCount, - audit.preservedIds, - audit.duplicateImageCount, - audit.status, - JSON.stringify(audit.details || {}), - audit.backupTable || null, - audit.startedAt, - audit.completedAt, - ], - ); -}; - -const sanitizeIdentifier = (value) => { - if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(value)) { - throw new Error(`Invalid SQL identifier: ${value}`); - } - return value; -}; - -const rebuildPlantsCatalog = async (db, rawEntries, options = {}) => { - if (!Array.isArray(rawEntries)) { - throw new PlantImportValidationError('Import payload must be an array of entries.', [ - { field: 'entries', message: 'Expected an array of plant objects.' }, - ]); - } - - const source = typeof options.source === 'string' && options.source.trim() - ? options.source.trim() - : 'manual'; - const preserveExistingIds = options.preserveExistingIds !== false; - const enforceUniqueImages = options.enforceUniqueImages !== false; - const startedAtIso = new Date().toISOString(); - - const existingRows = await all(db, 'SELECT id, botanicalName FROM plants'); - const existingIdMap = parseExistingIdMap(existingRows); - - const validationErrors = []; - const preparedEntries = rawEntries.map((rawEntry, index) => { - const prepared = prepareEntry(rawEntry, index, existingIdMap, preserveExistingIds); - if (prepared.errors.length > 0) { - validationErrors.push(...prepared.errors); - } - return prepared.entry; - }); - - if (validationErrors.length > 0) { - throw new PlantImportValidationError( - 'Import payload failed validation checks.', - validationErrors.slice(0, MAX_AUDIT_DETAILS), - ); - } - - assertValidPreparedEntries(preparedEntries, enforceUniqueImages); - - const preservedIds = preparedEntries.reduce((count, entry) => { - if (existingIdMap.get(normalizeKey(entry.botanicalName)) === entry.id) return count + 1; - return count; - }, 0); - - const timestamp = startedAtIso.replace(/[-:.TZ]/g, '').slice(0, 14); - const backupTable = sanitizeIdentifier(`plants_backup_${timestamp}`); - const details = { - enforceUniqueImages, - preserveExistingIds, - inputCount: rawEntries.length, - preparedCount: preparedEntries.length, - }; - - try { - await run(db, 'BEGIN IMMEDIATE TRANSACTION'); - await run(db, `DROP TABLE IF EXISTS ${backupTable}`); - await run(db, `CREATE TABLE ${backupTable} AS SELECT * FROM plants`); - await run(db, 'DELETE FROM plants'); - - for (const entry of preparedEntries) { - await run( - db, - `INSERT INTO plants ( - id, - name, - botanicalName, - imageUri, - imageStatus, - description, - categories, - careInfo, - confidence, - createdAt, - updatedAt - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, - [ - entry.id, - entry.name, - entry.botanicalName, - entry.imageUri, - entry.imageStatus, - entry.description, - JSON.stringify(entry.categories), - JSON.stringify(entry.careInfo), - entry.confidence, - startedAtIso, - startedAtIso, - ], - ); - } - - await run( - db, - 'CREATE UNIQUE INDEX IF NOT EXISTS idx_plants_botanical_name_unique ON plants(botanicalName)', - ); - if (enforceUniqueImages) { - await run( - db, - 'CREATE UNIQUE INDEX IF NOT EXISTS idx_plants_image_uri_unique ON plants(imageUri)', - ); - } else { - await run(db, 'DROP INDEX IF EXISTS idx_plants_image_uri_unique'); - } - - await run(db, 'COMMIT'); - } catch (error) { - await run(db, 'ROLLBACK'); - const completedAtIso = new Date().toISOString(); - await writeAuditRow(db, { - source, - importedCount: 0, - preservedIds: 0, - duplicateImageCount: 0, - status: 'failed', - details: { - ...details, - error: error instanceof Error ? error.message : String(error), - }, - backupTable: null, - startedAt: startedAtIso, - completedAt: completedAtIso, - }); - throw error; - } - - const duplicateImages = await all( - db, - `SELECT imageUri, COUNT(*) AS count - FROM plants - GROUP BY imageUri - HAVING COUNT(*) > 1`, - ); - - const completedAtIso = new Date().toISOString(); - await writeAuditRow(db, { - source, - importedCount: preparedEntries.length, - preservedIds, - duplicateImageCount: duplicateImages.length, - status: 'success', - details, - backupTable, - startedAt: startedAtIso, - completedAt: completedAtIso, - }); - - return { - source, - importedCount: preparedEntries.length, - preservedIds, - duplicateImageCount: duplicateImages.length, - backupTable, - startedAt: startedAtIso, - completedAt: completedAtIso, - }; -}; - -module.exports = { - PlantImportValidationError, - ensurePlantSchema, - getPlantDiagnostics, - getPlants, - normalizeKey, - normalizeImageUri, - toWikimediaFilePathUrl, - rebuildPlantsCatalog, -}; +const crypto = require('crypto'); +const { all, get, run } = require('./postgres'); +const { normalizeSearchText, rankHybridEntries } = require('./hybridSearch'); + +const DEFAULT_LIMIT = 60; +const MAX_LIMIT = 500; +const MAX_AUDIT_DETAILS = 80; +const WIKIMEDIA_FILEPATH_SEGMENT = 'Special:FilePath/'; +const WIKIMEDIA_REDIRECT_BASE = 'https://commons.wikimedia.org/wiki/Special:FilePath/'; +const WIKIMEDIA_SEARCH_PREFIX = 'wikimedia-search:'; +const LOCAL_PLANT_IMAGE_PREFIX = '/plants/'; +const LOCAL_PLANT_IMAGE_PATH_PATTERN = /^\/plants\/[A-Za-z0-9/_-]+\.[A-Za-z0-9]+$/; + +class PlantImportValidationError extends Error { + constructor(message, details) { + super(message); + this.name = 'PlantImportValidationError'; + this.details = details; + } +} + +const normalizeWhitespace = (value) => { + return value.trim().replace(/\s+/g, ' '); +}; + +const normalizeKey = (value) => normalizeSearchText(normalizeWhitespace(value)); + +const unwrapMarkdownLink = (value) => { + const markdownMatch = value.match(/^\[[^\]]+]\((https?:\/\/[^)]+)\)(.*)$/i); + if (!markdownMatch) return value; + const [, url, suffix] = markdownMatch; + return `${url}${suffix || ''}`; +}; + +const tryDecode = (value) => { + try { + return decodeURIComponent(value); + } catch { + return value; + } +}; + +const decodeRepeatedly = (value, rounds = 3) => { + let current = value; + for (let index = 0; index < rounds; index += 1) { + const decoded = tryDecode(current); + if (decoded === current) break; + current = decoded; + } + return current; +}; + +const convertWikimediaFilePathUrl = (value) => { + const segmentIndex = value.indexOf(WIKIMEDIA_FILEPATH_SEGMENT); + if (segmentIndex < 0) return null; + + const fileNameStart = segmentIndex + WIKIMEDIA_FILEPATH_SEGMENT.length; + const rawFileName = value.slice(fileNameStart).split(/[?#]/)[0].trim(); + if (!rawFileName) return null; + + const decodedFileName = tryDecode(rawFileName).replace(/\s+/g, ' ').trim(); + if (!decodedFileName) return null; + const encodedFileName = encodeURIComponent(decodedFileName).replace(/%2F/g, '/'); + return `${WIKIMEDIA_REDIRECT_BASE}${encodedFileName}`; +}; + +const toWikimediaFilePathUrl = (value) => { + if (typeof value !== 'string' || !value.includes('upload.wikimedia.org/wikipedia/commons/')) { + return null; + } + + const cleanUrl = value.split(/[?#]/)[0]; + const parts = cleanUrl.split('/').filter(Boolean); + if (parts.length < 2) return null; + + let fileName = null; + const thumbIndex = parts.indexOf('thumb'); + + if (thumbIndex >= 0 && parts.length >= thumbIndex + 5) { + fileName = parts[parts.length - 2]; + } else { + fileName = parts[parts.length - 1]; + } + + if (!fileName) return null; + + const decoded = tryDecode(fileName).trim(); + if (!decoded) return null; + + return `${WIKIMEDIA_REDIRECT_BASE}${encodeURIComponent(decoded)}`; +}; + +const normalizeLocalImagePath = (value) => { + if (typeof value !== 'string') return null; + + const trimmed = value.trim(); + if (!trimmed) return null; + + const withoutQuery = trimmed.split(/[?#]/)[0].replace(/\\/g, '/'); + const withLeadingSlash = withoutQuery.startsWith('/') ? withoutQuery : `/${withoutQuery}`; + + if (!withLeadingSlash.startsWith(LOCAL_PLANT_IMAGE_PREFIX)) return null; + if (withLeadingSlash.includes('..')) return null; + if (!LOCAL_PLANT_IMAGE_PATH_PATTERN.test(withLeadingSlash)) return null; + + return withLeadingSlash; +}; + +const normalizeWikimediaSearchUri = (value) => { + if (typeof value !== 'string') return null; + + const trimmed = value.trim(); + if (!trimmed.toLowerCase().startsWith(WIKIMEDIA_SEARCH_PREFIX)) return null; + + const rawQuery = trimmed.slice(WIKIMEDIA_SEARCH_PREFIX.length).trim(); + if (!rawQuery) return null; + + const normalizedQuery = normalizeWhitespace(decodeRepeatedly(rawQuery)); + if (!normalizedQuery) return null; + + return `${WIKIMEDIA_SEARCH_PREFIX}${encodeURIComponent(normalizedQuery)}`; +}; + +const normalizeImageUri = (rawUri) => { + if (typeof rawUri !== 'string') return null; + + const trimmed = rawUri.trim(); + if (!trimmed) return null; + + const localPath = normalizeLocalImagePath(trimmed); + if (localPath) return localPath; + + const wikimediaSearchUri = normalizeWikimediaSearchUri(trimmed); + if (wikimediaSearchUri) return wikimediaSearchUri; + + const normalized = unwrapMarkdownLink(trimmed); + const converted = convertWikimediaFilePathUrl(normalized); + const candidate = (converted || normalized).replace(/^http:\/\//i, 'https://'); + + let parsedUrl; + try { + parsedUrl = new URL(candidate); + } catch { + return null; + } + + const protocol = parsedUrl.protocol.toLowerCase(); + if (protocol !== 'https:' && protocol !== 'http:') return null; + if (!parsedUrl.hostname) return null; + + parsedUrl.protocol = 'https:'; + return parsedUrl.toString(); +}; + +const toArrayOfStrings = (value) => { + if (!Array.isArray(value)) return []; + const normalized = value + .map((item) => (typeof item === 'string' ? normalizeWhitespace(item) : '')) + .filter(Boolean); + return [...new Set(normalized)]; +}; + +const parseNumber = (value, fallback) => { + const parsed = Number(value); + if (!Number.isFinite(parsed)) return fallback; + return parsed; +}; + +const buildStablePlantId = (botanicalName) => { + const hash = crypto + .createHash('sha1') + .update(normalizeKey(botanicalName)) + .digest('hex') + .slice(0, 16); + return `plant_${hash}`; +}; + +const parseExistingIdMap = (rows) => { + const botanicalToId = new Map(); + rows.forEach((row) => { + if (!row || typeof row.botanicalName !== 'string' || typeof row.id !== 'string') return; + botanicalToId.set(normalizeKey(row.botanicalName), row.id); + }); + return botanicalToId; +}; + +const prepareEntry = (rawEntry, index, existingIdMap, preserveExistingIds) => { + const errors = []; + + const name = typeof rawEntry?.name === 'string' ? normalizeWhitespace(rawEntry.name) : ''; + const botanicalName = typeof rawEntry?.botanicalName === 'string' + ? normalizeWhitespace(rawEntry.botanicalName) + : ''; + + if (!name) { + errors.push({ index, field: 'name', message: 'name is required.' }); + } + if (!botanicalName) { + errors.push({ index, field: 'botanicalName', message: 'botanicalName is required.' }); + } + + const normalizedBotanicalKey = botanicalName ? normalizeKey(botanicalName) : ''; + const existingId = preserveExistingIds ? existingIdMap.get(normalizedBotanicalKey) : null; + const incomingId = typeof rawEntry?.id === 'string' ? normalizeWhitespace(rawEntry.id) : ''; + const id = incomingId || existingId || (botanicalName ? buildStablePlantId(botanicalName) : ''); + + if (!id) { + errors.push({ index, field: 'id', message: 'Could not derive stable plant id.' }); + } + + const imageUri = normalizeImageUri(rawEntry?.imageUri); + if (!imageUri) { + errors.push({ + index, + field: 'imageUri', + message: 'imageUri is missing or invalid. Use a valid http(s) URL, a local /plants/... path, or wikimedia-search:.', + value: rawEntry?.imageUri ?? null, + }); + } + const imageStatus = imageUri && imageUri.startsWith(WIKIMEDIA_SEARCH_PREFIX) ? 'pending' : 'ok'; + + const categories = toArrayOfStrings(rawEntry?.categories); + const confidence = parseNumber(rawEntry?.confidence, 1); + const clampedConfidence = Math.max(0, Math.min(1, Number(confidence.toFixed(4)))); + const description = typeof rawEntry?.description === 'string' ? rawEntry.description.trim() : ''; + const careInfoRaw = rawEntry?.careInfo || {}; + const careInfo = { + waterIntervalDays: Math.max(1, Math.round(parseNumber(careInfoRaw.waterIntervalDays, 7))), + light: typeof careInfoRaw.light === 'string' && careInfoRaw.light.trim() + ? normalizeWhitespace(careInfoRaw.light) + : 'Unknown', + temp: typeof careInfoRaw.temp === 'string' && careInfoRaw.temp.trim() + ? normalizeWhitespace(careInfoRaw.temp) + : 'Unknown', + }; + + return { + entry: { + id, + name, + botanicalName, + imageUri, + imageStatus, + description, + categories, + careInfo, + confidence: clampedConfidence, + }, + errors, + }; +}; + +const collectDuplicateErrors = (entries, getKey, fieldName, message) => { + const counts = new Map(); + entries.forEach((entry, index) => { + const key = getKey(entry); + if (!key) return; + const existing = counts.get(key) || []; + existing.push(index); + counts.set(key, existing); + }); + + const duplicateErrors = []; + counts.forEach((indices, key) => { + if (indices.length <= 1) return; + indices.forEach((index) => { + duplicateErrors.push({ + index, + field: fieldName, + message, + value: key, + }); + }); + }); + return duplicateErrors; +}; + +const assertValidPreparedEntries = (entries, enforceUniqueImages) => { + const duplicateErrors = []; + duplicateErrors.push( + ...collectDuplicateErrors( + entries, + (entry) => entry.id, + 'id', + 'Duplicate plant id detected in import payload.', + ), + ); + duplicateErrors.push( + ...collectDuplicateErrors( + entries, + (entry) => normalizeKey(entry.botanicalName), + 'botanicalName', + 'Duplicate botanicalName detected in import payload.', + ), + ); + + if (enforceUniqueImages) { + duplicateErrors.push( + ...collectDuplicateErrors( + entries, + (entry) => entry.imageUri, + 'imageUri', + 'Duplicate imageUri detected across multiple plants.', + ), + ); + } + + if (duplicateErrors.length > 0) { + throw new PlantImportValidationError( + 'Import payload contains duplicate keys.', + duplicateErrors.slice(0, MAX_AUDIT_DETAILS), + ); + } +}; + +const parseJsonArray = (value) => { + if (!value) return []; + if (Array.isArray(value)) return value; + if (typeof value === 'string') { + try { + const parsed = JSON.parse(value); + return Array.isArray(parsed) ? parsed : []; + } catch { + return []; + } + } + return []; +}; + +const parseJsonObject = (value) => { + if (!value) return {}; + if (typeof value === 'object' && !Array.isArray(value)) return value; + if (typeof value === 'string') { + try { + const parsed = JSON.parse(value); + return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {}; + } catch { + return {}; + } + } + return {}; +}; + +const toApiPlant = (row) => { + const categories = parseJsonArray(row.categories); + const careInfo = parseJsonObject(row.careInfo); + const imageUri = toWikimediaFilePathUrl(row.imageUri) || row.imageUri; + return { + id: row.id, + name: row.name, + botanicalName: row.botanicalName, + imageUri, + imageStatus: row.imageStatus || 'ok', + description: row.description || '', + categories, + careInfo, + confidence: Number(row.confidence) || 0, + }; +}; + +const ensurePlantSchema = async (db) => { + await run( + db, + `CREATE TABLE IF NOT EXISTS plants ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + botanical_name TEXT NOT NULL, + image_uri TEXT NOT NULL, + image_status TEXT NOT NULL DEFAULT 'ok', + description TEXT, + categories JSONB NOT NULL DEFAULT '[]'::jsonb, + care_info JSONB NOT NULL DEFAULT '{}'::jsonb, + confidence DOUBLE PRECISION NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP + )`, + ); + + await run( + db, + `CREATE TABLE IF NOT EXISTS plant_import_audit ( + id BIGSERIAL PRIMARY KEY, + source TEXT NOT NULL, + imported_count INTEGER NOT NULL DEFAULT 0, + preserved_ids INTEGER NOT NULL DEFAULT 0, + duplicate_image_count INTEGER NOT NULL DEFAULT 0, + status TEXT NOT NULL, + details JSONB, + backup_table TEXT, + started_at TIMESTAMPTZ NOT NULL, + completed_at TIMESTAMPTZ NOT NULL + )`, + ); + + await run( + db, + 'CREATE UNIQUE INDEX IF NOT EXISTS idx_plants_botanical_name_unique ON plants (LOWER(botanical_name))', + ); + await run( + db, + 'CREATE INDEX IF NOT EXISTS idx_plants_name ON plants (LOWER(name))', + ); + await run( + db, + 'CREATE INDEX IF NOT EXISTS idx_plant_import_audit_started_at ON plant_import_audit (started_at DESC)', + ); +}; + +const getPlants = async (db, options = {}) => { + const query = typeof options.query === 'string' ? options.query.trim() : ''; + const category = typeof options.category === 'string' ? options.category.trim() : ''; + const limitRaw = Number(options.limit); + const limit = Number.isFinite(limitRaw) + ? Math.max(1, Math.min(MAX_LIMIT, Math.round(limitRaw))) + : DEFAULT_LIMIT; + + const rows = await all( + db, + `SELECT + id, + name, + botanical_name AS "botanicalName", + image_uri AS "imageUri", + image_status AS "imageStatus", + description, + categories, + care_info AS "careInfo", + confidence + FROM plants + ORDER BY LOWER(name) ASC`, + ); + + let results = rows.map(toApiPlant); + + if (category) { + results = results.filter((plant) => plant.categories.includes(category)); + } + + if (!query) { + return results.slice(0, limit); + } + + return rankHybridEntries(results, query, limit) + .map((candidate) => candidate.entry); +}; + +const getPlantDiagnostics = async (db) => { + const totals = await get( + db, + `SELECT + COUNT(*) AS "totalCount", + SUM(CASE WHEN image_uri IS NULL OR BTRIM(image_uri) = '' THEN 1 ELSE 0 END) AS "missingImageCount", + SUM(CASE WHEN COALESCE(image_status, 'ok') <> 'ok' THEN 1 ELSE 0 END) AS "nonOkImageStatusCount" + FROM plants`, + ); + + const duplicateImages = await all( + db, + `SELECT image_uri AS "imageUri", COUNT(*) AS count + FROM plants + WHERE image_uri IS NOT NULL AND BTRIM(image_uri) <> '' + GROUP BY image_uri + HAVING COUNT(*) > 1 + ORDER BY count DESC, image_uri ASC + LIMIT 200`, + ); + + const duplicateBotanicalNames = await all( + db, + `SELECT botanical_name AS "botanicalName", COUNT(*) AS count + FROM plants + WHERE botanical_name IS NOT NULL AND BTRIM(botanical_name) <> '' + GROUP BY LOWER(botanical_name), botanical_name + HAVING COUNT(*) > 1 + ORDER BY count DESC, botanical_name ASC + LIMIT 200`, + ); + + const recentAudits = await all( + db, + `SELECT + id, + source, + imported_count AS "importedCount", + preserved_ids AS "preservedIds", + duplicate_image_count AS "duplicateImageCount", + status, + details, + backup_table AS "backupTable", + started_at AS "startedAt", + completed_at AS "completedAt" + FROM plant_import_audit + ORDER BY started_at DESC + LIMIT 20`, + ); + + return { + totalCount: Number(totals?.totalCount || 0), + missingImageCount: Number(totals?.missingImageCount || 0), + nonOkImageStatusCount: Number(totals?.nonOkImageStatusCount || 0), + duplicateImageCount: duplicateImages.length, + duplicateImages, + duplicateBotanicalNameCount: duplicateBotanicalNames.length, + duplicateBotanicalNames, + recentAudits: recentAudits.map((audit) => ({ + ...audit, + details: parseJsonObject(audit.details), + })), + }; +}; + +const writeAuditRow = async (db, audit) => { + await run( + db, + `INSERT INTO plant_import_audit ( + source, + imported_count, + preserved_ids, + duplicate_image_count, + status, + details, + backup_table, + started_at, + completed_at + ) VALUES ($1, $2, $3, $4, $5, CAST($6 AS jsonb), $7, $8, $9)`, + [ + audit.source, + audit.importedCount, + audit.preservedIds, + audit.duplicateImageCount, + audit.status, + JSON.stringify(audit.details || {}), + audit.backupTable || null, + audit.startedAt, + audit.completedAt, + ], + ); +}; + +const sanitizeIdentifier = (value) => { + if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(value)) { + throw new Error(`Invalid SQL identifier: ${value}`); + } + return value; +}; + +const openTransaction = async (db) => { + if (typeof db.connect === 'function') { + const client = await db.connect(); + await run(client, 'BEGIN'); + return { + tx: client, + release: () => client.release(), + }; + } + + await run(db, 'BEGIN'); + return { + tx: db, + release: () => {}, + }; +}; + +const rebuildPlantsCatalog = async (db, rawEntries, options = {}) => { + if (!Array.isArray(rawEntries)) { + throw new PlantImportValidationError('Import payload must be an array of entries.', [ + { field: 'entries', message: 'Expected an array of plant objects.' }, + ]); + } + + const source = typeof options.source === 'string' && options.source.trim() + ? options.source.trim() + : 'manual'; + const preserveExistingIds = options.preserveExistingIds !== false; + const enforceUniqueImages = options.enforceUniqueImages !== false; + const startedAtIso = new Date().toISOString(); + + const existingRows = await all( + db, + 'SELECT id, botanical_name AS "botanicalName" FROM plants', + ); + const existingIdMap = parseExistingIdMap(existingRows); + + const validationErrors = []; + const preparedEntries = rawEntries.map((rawEntry, index) => { + const prepared = prepareEntry(rawEntry, index, existingIdMap, preserveExistingIds); + if (prepared.errors.length > 0) { + validationErrors.push(...prepared.errors); + } + return prepared.entry; + }); + + if (validationErrors.length > 0) { + throw new PlantImportValidationError( + 'Import payload failed validation checks.', + validationErrors.slice(0, MAX_AUDIT_DETAILS), + ); + } + + assertValidPreparedEntries(preparedEntries, enforceUniqueImages); + + const preservedIds = preparedEntries.reduce((count, entry) => { + if (existingIdMap.get(normalizeKey(entry.botanicalName)) === entry.id) return count + 1; + return count; + }, 0); + + const timestamp = startedAtIso.replace(/[-:.TZ]/g, '').slice(0, 14); + const backupTable = sanitizeIdentifier(`plants_backup_${timestamp}`); + const details = { + enforceUniqueImages, + preserveExistingIds, + inputCount: rawEntries.length, + preparedCount: preparedEntries.length, + }; + + const { tx, release } = await openTransaction(db); + + try { + await run(tx, `DROP TABLE IF EXISTS ${backupTable}`); + await run(tx, `CREATE TABLE ${backupTable} AS SELECT * FROM plants`); + await run(tx, 'DELETE FROM plants'); + + for (const entry of preparedEntries) { + await run( + tx, + `INSERT INTO plants ( + id, + name, + botanical_name, + image_uri, + image_status, + description, + categories, + care_info, + confidence, + created_at, + updated_at + ) VALUES ($1, $2, $3, $4, $5, $6, CAST($7 AS jsonb), CAST($8 AS jsonb), $9, $10, $11)`, + [ + entry.id, + entry.name, + entry.botanicalName, + entry.imageUri, + entry.imageStatus, + entry.description, + JSON.stringify(entry.categories), + JSON.stringify(entry.careInfo), + entry.confidence, + startedAtIso, + startedAtIso, + ], + ); + } + + await run( + tx, + 'CREATE UNIQUE INDEX IF NOT EXISTS idx_plants_botanical_name_unique ON plants (LOWER(botanical_name))', + ); + if (enforceUniqueImages) { + await run( + tx, + 'CREATE UNIQUE INDEX IF NOT EXISTS idx_plants_image_uri_unique ON plants (image_uri)', + ); + } else { + await run(tx, 'DROP INDEX IF EXISTS idx_plants_image_uri_unique'); + } + + await run(tx, 'COMMIT'); + } catch (error) { + try { + await run(tx, 'ROLLBACK'); + } catch (rollbackError) { + console.error('Failed to rollback plant rebuild transaction.', rollbackError); + } + release(); + + const completedAtIso = new Date().toISOString(); + await writeAuditRow(db, { + source, + importedCount: 0, + preservedIds: 0, + duplicateImageCount: 0, + status: 'failed', + details: { + ...details, + error: error instanceof Error ? error.message : String(error), + }, + backupTable: null, + startedAt: startedAtIso, + completedAt: completedAtIso, + }); + throw error; + } + + release(); + + const duplicateImages = await all( + db, + `SELECT image_uri AS "imageUri", COUNT(*) AS count + FROM plants + GROUP BY image_uri + HAVING COUNT(*) > 1`, + ); + + const completedAtIso = new Date().toISOString(); + await writeAuditRow(db, { + source, + importedCount: preparedEntries.length, + preservedIds, + duplicateImageCount: duplicateImages.length, + status: 'success', + details, + backupTable, + startedAt: startedAtIso, + completedAt: completedAtIso, + }); + + return { + source, + importedCount: preparedEntries.length, + preservedIds, + duplicateImageCount: duplicateImages.length, + backupTable, + startedAt: startedAtIso, + completedAt: completedAtIso, + }; +}; + +module.exports = { + PlantImportValidationError, + ensurePlantSchema, + getPlantDiagnostics, + getPlants, + normalizeKey, + normalizeImageUri, + toWikimediaFilePathUrl, + rebuildPlantsCatalog, +}; diff --git a/server/lib/postgres.js b/server/lib/postgres.js new file mode 100644 index 0000000..f46e2c0 --- /dev/null +++ b/server/lib/postgres.js @@ -0,0 +1,93 @@ +const { Pool } = require('pg'); + +const parseBoolean = (value, fallback = false) => { + if (typeof value !== 'string') return fallback; + const normalized = value.trim().toLowerCase(); + if (['1', 'true', 'yes', 'on'].includes(normalized)) return true; + if (['0', 'false', 'no', 'off'].includes(normalized)) return false; + return fallback; +}; + +const buildDatabaseUrlFromParts = () => { + const host = (process.env.POSTGRES_HOST || 'postgres').trim(); + const port = Number(process.env.POSTGRES_PORT || 5432); + const database = (process.env.POSTGRES_DB || 'greenlns').trim(); + const user = (process.env.POSTGRES_USER || 'greenlns').trim(); + const password = process.env.POSTGRES_PASSWORD; + if (!password) { + return ''; + } + + return `postgresql://${encodeURIComponent(user)}:${encodeURIComponent(password)}@${host}:${port}/${encodeURIComponent(database)}`; +}; + +const getDefaultDbPath = () => { + return (process.env.DATABASE_URL || buildDatabaseUrlFromParts()).trim(); +}; + +const getPoolConfig = () => { + const connectionString = getDefaultDbPath(); + if (!connectionString) { + throw new Error('DATABASE_URL or POSTGRES_* environment variables are required.'); + } + + const sslEnabled = parseBoolean(process.env.DATABASE_SSL, false); + return { + connectionString, + max: Number(process.env.PGPOOL_MAX || 10), + ssl: sslEnabled ? { rejectUnauthorized: false } : false, + }; +}; + +const translateSql = (sql) => { + if (typeof sql !== 'string') return sql; + + let placeholderIndex = 0; + return sql + .replace(/\?/g, () => { + placeholderIndex += 1; + return `$${placeholderIndex}`; + }) + .replace(/BEGIN\s+IMMEDIATE\s+TRANSACTION/gi, 'BEGIN') + .replace(/datetime\('now'\)/gi, 'CURRENT_TIMESTAMP') + .replace(/\s+COLLATE\s+NOCASE/gi, ''); +}; + +const openDatabase = async () => { + const pool = new Pool(getPoolConfig()); + await pool.query('SELECT 1'); + return pool; +}; + +const closeDatabase = async (db) => { + if (!db || typeof db.end !== 'function') return; + await db.end(); +}; + +const run = async (db, sql, params = []) => { + const result = await db.query(translateSql(sql), params); + return { + lastId: result.rows?.[0]?.id ?? null, + changes: result.rowCount || 0, + rows: result.rows || [], + }; +}; + +const get = async (db, sql, params = []) => { + const result = await db.query(translateSql(sql), params); + return result.rows[0] || null; +}; + +const all = async (db, sql, params = []) => { + const result = await db.query(translateSql(sql), params); + return result.rows || []; +}; + +module.exports = { + all, + closeDatabase, + get, + getDefaultDbPath, + openDatabase, + run, +}; diff --git a/server/lib/sqlite.js b/server/lib/sqlite.js index 8e25645..e515761 100644 --- a/server/lib/sqlite.js +++ b/server/lib/sqlite.js @@ -1,86 +1 @@ -const fs = require('fs'); -const path = require('path'); -const sqlite3 = require('sqlite3').verbose(); - -const getDefaultDbPath = () => { - return process.env.PLANT_DB_PATH || path.join(__dirname, '..', 'data', 'greenlns.sqlite'); -}; - -const ensureDbDirectory = (dbPath) => { - const directory = path.dirname(dbPath); - fs.mkdirSync(directory, { recursive: true }); -}; - -const openDatabase = (dbPath = getDefaultDbPath()) => { - ensureDbDirectory(dbPath); - - return new Promise((resolve, reject) => { - const db = new sqlite3.Database(dbPath, (error) => { - if (error) { - reject(error); - return; - } - resolve(db); - }); - }); -}; - -const closeDatabase = (db) => { - return new Promise((resolve, reject) => { - db.close((error) => { - if (error) { - reject(error); - return; - } - resolve(); - }); - }); -}; - -const run = (db, sql, params = []) => { - return new Promise((resolve, reject) => { - db.run(sql, params, function onRun(error) { - if (error) { - reject(error); - return; - } - resolve({ - lastId: this.lastID, - changes: this.changes, - }); - }); - }); -}; - -const get = (db, sql, params = []) => { - return new Promise((resolve, reject) => { - db.get(sql, params, (error, row) => { - if (error) { - reject(error); - return; - } - resolve(row || null); - }); - }); -}; - -const all = (db, sql, params = []) => { - return new Promise((resolve, reject) => { - db.all(sql, params, (error, rows) => { - if (error) { - reject(error); - return; - } - resolve(rows || []); - }); - }); -}; - -module.exports = { - all, - closeDatabase, - get, - getDefaultDbPath, - openDatabase, - run, -}; +module.exports = require('./postgres'); diff --git a/server/package-lock.json b/server/package-lock.json index a9dd7bc..2ed103d 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -13,8 +13,8 @@ "dotenv": "^17.3.1", "express": "^5.2.1", "minio": "^8.0.5", + "pg": "^8.16.3", "sharp": "^0.34.5", - "sqlite3": "^5.1.7", "stripe": "^20.3.1" } }, @@ -28,13 +28,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "license": "MIT", - "optional": true - }, "node_modules/@img/colour": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", @@ -500,49 +493,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "license": "MIT", - "optional": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC", - "optional": true - }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -556,131 +506,12 @@ "node": ">= 0.6" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "optional": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/aproba": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", - "license": "ISC", - "optional": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT", - "optional": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/block-stream2": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/block-stream2/-/block-stream2-2.1.0.tgz", @@ -714,47 +545,12 @@ "url": "https://opencollective.com/express" } }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/browser-or-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==", "license": "MIT" }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-crc32": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", @@ -773,36 +569,6 @@ "node": ">= 0.8" } }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, "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", @@ -832,49 +598,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "optional": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT", - "optional": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC", - "optional": true - }, "node_modules/content-disposition": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", @@ -958,37 +681,6 @@ "node": ">=0.10" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT", - "optional": true - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1039,13 +731,6 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "optional": true - }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -1055,55 +740,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "license": "MIT", - "optional": true - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -1155,15 +791,6 @@ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "engines": { - "node": ">=6" - } - }, "node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", @@ -1238,12 +865,6 @@ "fxparser": "src/cli/cli.js" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "license": "MIT" - }, "node_modules/filter-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", @@ -1292,31 +913,6 @@ "node": ">= 0.8" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC", - "optional": true - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -1326,27 +922,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -1384,34 +959,6 @@ "node": ">= 0.4" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -1424,13 +971,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC", - "optional": true - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -1443,13 +983,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC", - "optional": true - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -1462,13 +995,6 @@ "node": ">= 0.4" } }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause", - "optional": true - }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -1489,45 +1015,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/iconv-lite": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", @@ -1544,87 +1031,12 @@ "url": "https://opencollective.com/express" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "license": "ISC", - "optional": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "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.", - "license": "ISC", - "optional": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -1634,93 +1046,18 @@ "node": ">= 0.10" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "license": "MIT", - "optional": true - }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC", - "optional": true - }, "node_modules/lodash": { "version": "4.17.23", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "license": "ISC", - "optional": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-fetch-happen/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -1776,40 +1113,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", - "license": "ISC", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minio": { "version": "8.0.7", "resolved": "https://registry.npmjs.org/minio/-/minio-8.0.7.tgz", @@ -1864,131 +1167,12 @@ "node": ">= 0.6" } }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "license": "MIT", - "optional": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT" - }, "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==", "license": "MIT" }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT" - }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -1998,82 +1182,6 @@ "node": ">= 0.6" } }, - "node_modules/node-abi": { - "version": "3.87.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", - "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT" - }, - "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "license": "MIT", - "optional": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2116,22 +1224,6 @@ "wrappy": "1" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2141,16 +1233,6 @@ "node": ">= 0.8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-to-regexp": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", @@ -2161,52 +1243,132 @@ "url": "https://opencollective.com/express" } }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "node_modules/pg": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.20.0.tgz", + "integrity": "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==", "license": "MIT", "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" + "pg-connection-string": "^2.12.0", + "pg-pool": "^3.13.0", + "pg-protocol": "^1.13.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" }, "engines": { - "node": ">=10" + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.3.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "license": "ISC", + "node_modules/pg-cloudflare": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", + "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", + "license": "MIT", "optional": true }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "node_modules/pg-connection-string": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.12.0.tgz", + "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.13.0.tgz", + "integrity": "sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", + "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "license": "MIT", - "optional": true, "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/proxy-addr": { @@ -2222,16 +1384,6 @@ "node": ">= 0.10" } }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/qs": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", @@ -2289,21 +1441,6 @@ "node": ">= 0.10" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -2318,33 +1455,6 @@ "node": ">= 6" } }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -2453,13 +1563,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC", - "optional": true - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -2582,99 +1685,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "optional": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "license": "MIT", - "optional": true, - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/split-on-first": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", @@ -2684,41 +1694,13 @@ "node": ">=6" } }, - "node_modules/sqlite3": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", - "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1", - "tar": "^6.1.11" - }, - "optionalDependencies": { - "node-gyp": "8.x" - }, - "peerDependencies": { - "node-gyp": "8.x" - }, - "peerDependenciesMeta": { - "node-gyp": { - "optional": true - } - } - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.1.1" - }, "engines": { - "node": ">= 8" + "node": ">= 10.x" } }, "node_modules/statuses": { @@ -2763,43 +1745,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stripe": { "version": "20.3.1", "resolved": "https://registry.npmjs.org/stripe/-/stripe-20.3.1.tgz", @@ -2829,67 +1774,6 @@ ], "license": "MIT" }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, "node_modules/through2": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", @@ -2915,18 +1799,6 @@ "license": "0BSD", "optional": true }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", @@ -2941,26 +1813,6 @@ "node": ">= 0.6" } }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "license": "ISC", - "optional": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -2985,32 +1837,6 @@ "node": ">= 0.8" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "optional": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3039,11 +1865,14 @@ "node": ">=4.0" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "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" + } } } } diff --git a/server/package.json b/server/package.json index 4f61142..4b44d01 100644 --- a/server/package.json +++ b/server/package.json @@ -13,13 +13,13 @@ "keywords": [], "author": "", "license": "ISC", - "dependencies": { - "cors": "^2.8.6", - "dotenv": "^17.3.1", - "express": "^5.2.1", - "minio": "^8.0.5", - "sharp": "^0.34.5", - "sqlite3": "^5.1.7", - "stripe": "^20.3.1" - } -} + "dependencies": { + "cors": "^2.8.6", + "dotenv": "^17.3.1", + "express": "^5.2.1", + "minio": "^8.0.5", + "pg": "^8.16.3", + "sharp": "^0.34.5", + "stripe": "^20.3.1" + } +} diff --git a/server/scripts/download-plant-images.js b/server/scripts/download-plant-images.js index 51dbe5a..1d36800 100644 --- a/server/scripts/download-plant-images.js +++ b/server/scripts/download-plant-images.js @@ -284,13 +284,13 @@ const convertToWebp = async (inputBuffer, outputPath) => { fs.unlinkSync(tempPath); }; -const updatePlantImageUri = async (db, plantId, localImageUri) => { - await run( - db, - 'UPDATE plants SET imageUri = ?, imageStatus = ?, updatedAt = datetime(\'now\') WHERE id = ?', - [localImageUri, 'ok', plantId], - ); -}; +const updatePlantImageUri = async (db, plantId, localImageUri) => { + await run( + db, + 'UPDATE plants SET image_uri = $1, image_status = $2, updated_at = NOW() WHERE id = $3', + [localImageUri, 'ok', plantId], + ); +}; const processPlant = async (db, plant, manifestItems, dumpFallbackMap, searchCache, refreshMatchers) => { const currentUri = String(plant.imageUri || '').trim(); @@ -402,12 +402,12 @@ const main = async () => { try { await ensurePlantSchema(db); - const plants = await all( - db, - `SELECT id, name, botanicalName, imageUri - FROM plants - ORDER BY name COLLATE NOCASE ASC`, - ); + const plants = await all( + db, + `SELECT id, name, botanical_name AS "botanicalName", image_uri AS "imageUri" + FROM plants + ORDER BY LOWER(name) ASC`, + ); console.log(`Preparing ${plants.length} plant images...`); diff --git a/services/authService.ts b/services/authService.ts index aa5ebc4..001eba0 100644 --- a/services/authService.ts +++ b/services/authService.ts @@ -1,12 +1,8 @@ -import * as SecureStore from 'expo-secure-store'; -import { AuthDb } from './database'; - -const SESSION_KEY = 'greenlens_session_v3'; -const BACKEND_URL = ( - process.env.EXPO_PUBLIC_BACKEND_URL || - process.env.EXPO_PUBLIC_PAYMENT_SERVER_URL || - '' -).trim(); +import * as SecureStore from 'expo-secure-store'; +import { AuthDb } from './database'; +import { getConfiguredBackendRootUrl } from '../utils/backendUrl'; + +const SESSION_KEY = 'greenlens_session_v3'; export interface AuthSession { userId: number; // local SQLite id (for plants/settings queries) @@ -23,9 +19,10 @@ const clearStoredSession = async (): Promise => { await SecureStore.deleteItemAsync(SESSION_KEY); }; -const authPost = async (path: string, body: object): Promise<{ userId: string; email: string; name: string; token: string }> => { - const hasBackendUrl = Boolean(BACKEND_URL); - const url = hasBackendUrl ? `${BACKEND_URL}${path}` : path; +const authPost = async (path: string, body: object): Promise<{ userId: string; email: string; name: string; token: string }> => { + const backendUrl = getConfiguredBackendRootUrl(); + const hasBackendUrl = Boolean(backendUrl); + const url = hasBackendUrl ? `${backendUrl}${path}` : path; let response: Response; try { response = await fetch(url, { @@ -104,14 +101,15 @@ export const AuthService = { await SecureStore.setItemAsync(SESSION_KEY, JSON.stringify({ ...session, name })); }, - async validateWithServer(): Promise<'valid' | 'invalid' | 'unreachable'> { - const session = await this.getSession(); - if (!session) return 'invalid'; - if (!BACKEND_URL) return 'unreachable'; - try { - const response = await fetch(`${BACKEND_URL}/v1/billing/summary`, { - headers: { Authorization: `Bearer ${session.token}` }, - }); + async validateWithServer(): Promise<'valid' | 'invalid' | 'unreachable'> { + const session = await this.getSession(); + if (!session) return 'invalid'; + const backendUrl = getConfiguredBackendRootUrl(); + if (!backendUrl) return 'unreachable'; + try { + const response = await fetch(`${backendUrl}/v1/billing/summary`, { + headers: { Authorization: `Bearer ${session.token}` }, + }); if (response.status === 401 || response.status === 403) return 'invalid'; return 'valid'; } catch { diff --git a/services/backend/backendApiClient.ts b/services/backend/backendApiClient.ts index d6b2778..c39351c 100644 --- a/services/backend/backendApiClient.ts +++ b/services/backend/backendApiClient.ts @@ -5,6 +5,7 @@ import { HealthCheckResponse, PurchaseProductId, RevenueCatCustomerInfo, + RevenueCatSyncSource, ScanPlantResponse, SemanticSearchResponse, ServiceHealthResponse, @@ -13,12 +14,12 @@ import { SimulateWebhookResponse, SyncRevenueCatStateResponse, } from './contracts'; -import { getAuthToken } from './userIdentityService'; -import { mockBackendService } from './mockBackendService'; -import { CareInfo, Language } from '../../types'; - -const BACKEND_BASE_URL = (process.env.EXPO_PUBLIC_BACKEND_URL || process.env.EXPO_PUBLIC_PAYMENT_SERVER_URL || '').trim(); -const REQUEST_TIMEOUT_MS = 15000; +import { getAuthToken } from './userIdentityService'; +import { mockBackendService } from './mockBackendService'; +import { CareInfo, Language } from '../../types'; +import { getConfiguredBackendRootUrl } from '../../utils/backendUrl'; + +const REQUEST_TIMEOUT_MS = 15000; const mapHttpStatusToErrorCode = (status: number): BackendErrorCode => { if (status === 400) return 'BAD_REQUEST'; @@ -28,10 +29,12 @@ const mapHttpStatusToErrorCode = (status: number): BackendErrorCode => { return 'PROVIDER_ERROR'; }; -const buildBackendUrl = (path: string): string => { - const base = BACKEND_BASE_URL.replace(/\/$/, ''); - return `${base}${path}`; -}; +const buildBackendUrl = (path: string): string => { + const backendBaseUrl = getConfiguredBackendRootUrl(); + if (!backendBaseUrl) return path; + const base = backendBaseUrl.replace(/\/$/, ''); + return `${base}${path}`; +}; const parseMaybeJson = (value: string): Record | null => { if (!value) return null; @@ -104,9 +107,9 @@ const makeRequest = async ( }; export const backendApiClient = { - getServiceHealth: async (): Promise => { - if (!BACKEND_BASE_URL) { - return { + getServiceHealth: async (): Promise => { + if (!getConfiguredBackendRootUrl()) { + return { ok: true, uptimeSec: 0, timestamp: new Date().toISOString(), @@ -127,10 +130,10 @@ export const backendApiClient = { }, getBillingSummary: async (): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.getBillingSummary(token); - } + const token = await getAuthToken(); + if (!getConfiguredBackendRootUrl()) { + return mockBackendService.getBillingSummary(token); + } return makeRequest('/v1/billing/summary', { method: 'GET', @@ -140,13 +143,15 @@ export const backendApiClient = { syncRevenueCatState: async (params: { customerInfo: RevenueCatCustomerInfo; + source?: RevenueCatSyncSource; }): Promise => { const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.syncRevenueCatState({ - userId: token, - customerInfo: params.customerInfo, - }); + if (!getConfiguredBackendRootUrl()) { + return mockBackendService.syncRevenueCatState({ + userId: token, + customerInfo: params.customerInfo, + source: params.source, + }); } return makeRequest('/v1/billing/sync-revenuecat', { @@ -154,6 +159,7 @@ export const backendApiClient = { token, body: { customerInfo: params.customerInfo, + source: params.source, }, }); }, @@ -162,10 +168,10 @@ export const backendApiClient = { idempotencyKey: string; imageUri: string; language: Language; - }): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.scanPlant({ + }): Promise => { + const token = await getAuthToken(); + if (!getConfiguredBackendRootUrl()) { + return mockBackendService.scanPlant({ userId: token, idempotencyKey: params.idempotencyKey, imageUri: params.imageUri, @@ -188,10 +194,10 @@ export const backendApiClient = { idempotencyKey: string; query: string; language: Language; - }): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.semanticSearch({ + }): Promise => { + const token = await getAuthToken(); + if (!getConfiguredBackendRootUrl()) { + return mockBackendService.semanticSearch({ userId: token, idempotencyKey: params.idempotencyKey, query: params.query, @@ -220,10 +226,10 @@ export const backendApiClient = { careInfo: CareInfo; description?: string; }; - }): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.healthCheck({ + }): Promise => { + const token = await getAuthToken(); + if (!getConfiguredBackendRootUrl()) { + return mockBackendService.healthCheck({ userId: token, idempotencyKey: params.idempotencyKey, imageUri: params.imageUri, @@ -247,10 +253,10 @@ export const backendApiClient = { simulatePurchase: async (params: { idempotencyKey: string; productId: PurchaseProductId; - }): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.simulatePurchase({ + }): Promise => { + const token = await getAuthToken(); + if (!getConfiguredBackendRootUrl()) { + return mockBackendService.simulatePurchase({ userId: token, idempotencyKey: params.idempotencyKey, productId: params.productId, @@ -271,10 +277,10 @@ export const backendApiClient = { idempotencyKey: string; event: SimulatedWebhookEvent; payload?: { credits?: number }; - }): Promise => { - const token = await getAuthToken(); - if (!BACKEND_BASE_URL) { - return mockBackendService.simulateWebhook({ + }): Promise => { + const token = await getAuthToken(); + if (!getConfiguredBackendRootUrl()) { + return mockBackendService.simulateWebhook({ userId: token, idempotencyKey: params.idempotencyKey, event: params.event, diff --git a/services/backend/contracts.ts b/services/backend/contracts.ts index 4042abf..c5867f1 100644 --- a/services/backend/contracts.ts +++ b/services/backend/contracts.ts @@ -149,6 +149,12 @@ export interface SimulateWebhookResponse { billing: BillingSummary; } +export type RevenueCatSyncSource = + | 'app_init' + | 'subscription_purchase' + | 'topup_purchase' + | 'restore'; + export interface SyncRevenueCatStateResponse { billing: BillingSummary; syncedAt: string; diff --git a/services/backend/mockBackendService.ts b/services/backend/mockBackendService.ts index 49931a8..8aca443 100644 --- a/services/backend/mockBackendService.ts +++ b/services/backend/mockBackendService.ts @@ -2,13 +2,15 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; import { BackendApiError, BillingProvider, - BillingSummary, + BillingSummary, HealthCheckRequest, HealthCheckResponse, PlanId, PurchaseProductId, RevenueCatCustomerInfo, + RevenueCatEntitlementInfo, RevenueCatNonSubscriptionTransaction, + RevenueCatSyncSource, ScanPlantRequest, ScanPlantResponse, SemanticSearchRequest, @@ -46,11 +48,12 @@ const TOPUP_CREDITS_BY_PRODUCT: Record = { monthly_pro: 0, yearly_pro: 0, topup_small: 25, - topup_medium: 75, - topup_large: 200, + topup_medium: 120, + topup_large: 300, }; const REVENUECAT_PRO_ENTITLEMENT_ID = (process.env.EXPO_PUBLIC_REVENUECAT_PRO_ENTITLEMENT_ID || 'pro').trim() || 'pro'; +const SUPPORTED_REVENUECAT_SUBSCRIPTION_PRODUCTS = new Set(['monthly_pro', 'yearly_pro']); interface MockAccountRecord { userId: string; @@ -243,6 +246,42 @@ const normalizeRevenueCatTransactions = ( const nonSubscriptions = customerInfo?.nonSubscriptions || {}; return Object.values(nonSubscriptions).flatMap((entries) => Array.isArray(entries) ? entries : []); }; + +const summarizeRevenueCatCustomerInfo = (customerInfo: RevenueCatCustomerInfo) => { + const activeEntitlements = customerInfo?.entitlements?.active || {}; + return { + appUserId: customerInfo?.appUserId ?? null, + originalAppUserId: customerInfo?.originalAppUserId ?? null, + activeEntitlements: Object.entries(activeEntitlements).map(([id, entitlement]) => ({ + id, + productIdentifier: entitlement?.productIdentifier ?? null, + expirationDate: entitlement?.expirationDate || entitlement?.expiresDate || null, + })), + allPurchasedProductIdentifiers: customerInfo?.allPurchasedProductIdentifiers ?? [], + nonSubscriptionTransactions: normalizeRevenueCatTransactions(customerInfo).map((transaction) => ({ + productIdentifier: transaction?.productIdentifier ?? null, + transactionIdentifier: transaction?.transactionIdentifier || transaction?.transactionId || null, + })), + }; +}; + +const getValidProEntitlement = (customerInfo: RevenueCatCustomerInfo): RevenueCatEntitlementInfo | null => { + const activeEntitlements = customerInfo?.entitlements?.active || {}; + const proEntitlement = activeEntitlements[REVENUECAT_PRO_ENTITLEMENT_ID]; + if (!proEntitlement) { + return null; + } + + if ( + proEntitlement.productIdentifier + && SUPPORTED_REVENUECAT_SUBSCRIPTION_PRODUCTS.has(proEntitlement.productIdentifier as PurchaseProductId) + ) { + return proEntitlement; + } + + console.warn('[Billing][Mock] Ignoring unsupported RevenueCat pro entitlement', summarizeRevenueCatCustomerInfo(customerInfo)); + return null; +}; const readIdempotentResponse = (store: IdempotencyStore, key: string): T | null => { const record = store[key]; @@ -652,17 +691,25 @@ export const mockBackendService = { syncRevenueCatState: async (request: { userId: string; customerInfo: RevenueCatCustomerInfo; + source?: RevenueCatSyncSource; }): Promise => { return withUserLock(request.userId, async () => { const stores = await loadStores(); const account = getOrCreateAccount(stores, request.userId); - const activeEntitlements = request.customerInfo?.entitlements?.active || {}; - const proEntitlement = activeEntitlements[REVENUECAT_PRO_ENTITLEMENT_ID]; + const proEntitlement = getValidProEntitlement(request.customerInfo); + const source = request.source || 'app_init'; - account.plan = proEntitlement ? 'pro' : 'free'; - account.provider = 'revenuecat'; - account.monthlyAllowance = getMonthlyAllowanceForPlan(account.plan, account.userId); - account.renewsAt = proEntitlement?.expirationDate || proEntitlement?.expiresDate || null; + console.log('[Billing][Mock] Syncing RevenueCat customer info', { + source, + customerInfo: summarizeRevenueCatCustomerInfo(request.customerInfo), + }); + + if (source !== 'topup_purchase') { + account.plan = proEntitlement ? 'pro' : 'free'; + account.provider = 'revenuecat'; + account.monthlyAllowance = getMonthlyAllowanceForPlan(account.plan, account.userId); + account.renewsAt = proEntitlement?.expirationDate || proEntitlement?.expiresDate || null; + } for (const transaction of normalizeRevenueCatTransactions(request.customerInfo)) { const productId = transaction.productIdentifier as PurchaseProductId | undefined; diff --git a/services/plantDatabaseService.ts b/services/plantDatabaseService.ts index 032e951..d89d9e3 100644 --- a/services/plantDatabaseService.ts +++ b/services/plantDatabaseService.ts @@ -1,6 +1,6 @@ import { IdentificationResult, Language } from '../types'; import { resolveImageUri, tryResolveImageUri } from '../utils/imageUri'; -import { getConfiguredApiBaseUrl } from '../utils/backendUrl'; +import { getConfiguredApiBaseUrl, getConfiguredBackendRootUrl } from '../utils/backendUrl'; import { backendApiClient } from './backend/backendApiClient'; import { BackendDatabaseEntry, isBackendApiError } from './backend/contracts'; import { createIdempotencyKey } from '../utils/idempotency'; @@ -26,14 +26,7 @@ export interface SemanticSearchResult { const DEFAULT_SEARCH_LIMIT = 500; -const hasConfiguredPlantBackend = (): boolean => Boolean( - String( - process.env.EXPO_PUBLIC_API_URL - || process.env.EXPO_PUBLIC_BACKEND_URL - || process.env.EXPO_PUBLIC_PAYMENT_SERVER_URL - || '', - ).trim(), -); +const hasConfiguredPlantBackend = (): boolean => Boolean(getConfiguredBackendRootUrl()); const normalizeImageStatus = (status?: string, imageUri?: string): 'ok' | 'missing' | 'invalid' => { if (status === 'ok' || status === 'missing' || status === 'invalid') return status; diff --git a/utils/backendUrl.ts b/utils/backendUrl.ts index fb0b895..cbd57fb 100644 --- a/utils/backendUrl.ts +++ b/utils/backendUrl.ts @@ -1,4 +1,4 @@ -const DEFAULT_API_BASE_URL = 'http://localhost:3000/api'; +const DEFAULT_API_BASE_URL = 'http://localhost:3000/api'; const normalizeHttpUrl = (value?: string | null): string | null => { const trimmed = String(value || '').trim(); @@ -12,19 +12,32 @@ const normalizeHttpUrl = (value?: string | null): string | null => { } }; -export const getConfiguredApiBaseUrl = (): string => { - const explicitApiUrl = normalizeHttpUrl(process.env.EXPO_PUBLIC_API_URL); - if (explicitApiUrl) return explicitApiUrl; +export const getConfiguredApiBaseUrl = (): string => { + const explicitApiUrl = normalizeHttpUrl(process.env.EXPO_PUBLIC_API_URL); + if (explicitApiUrl) return explicitApiUrl; + + const backendBaseUrl = normalizeHttpUrl( + process.env.EXPO_PUBLIC_BACKEND_URL || process.env.EXPO_PUBLIC_PAYMENT_SERVER_URL, + ); + if (backendBaseUrl) { + return backendBaseUrl.endsWith('/api') ? backendBaseUrl : `${backendBaseUrl}/api`; + } - const backendBaseUrl = normalizeHttpUrl( - process.env.EXPO_PUBLIC_BACKEND_URL || process.env.EXPO_PUBLIC_PAYMENT_SERVER_URL, - ); - if (backendBaseUrl) { - return backendBaseUrl.endsWith('/api') ? backendBaseUrl : `${backendBaseUrl}/api`; - } - - return DEFAULT_API_BASE_URL; -}; + return DEFAULT_API_BASE_URL; +}; + +export const getConfiguredBackendRootUrl = (): string => { + const explicitApiUrl = normalizeHttpUrl(process.env.EXPO_PUBLIC_API_URL); + if (explicitApiUrl) { + return explicitApiUrl.endsWith('/api') + ? explicitApiUrl.slice(0, -4).replace(/\/+$/, '') + : explicitApiUrl; + } + + return normalizeHttpUrl( + process.env.EXPO_PUBLIC_BACKEND_URL || process.env.EXPO_PUBLIC_PAYMENT_SERVER_URL, + ) || ''; +}; export const getConfiguredAssetBaseUrl = (): string => { const apiBaseUrl = getConfiguredApiBaseUrl();